如何解决填充静态列表的最佳方法
我有一个从其他班级继承的班级 我正在从数据库中查询 如何使用linq lambda填写不带循环的静态列表 如果他发现很多数据。这不会很快 我想逃避循环
public class Currencys
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public long Curr_Id { get; set; }
[StringLength(50)]
public string Curr_Name { get; set; }
[StringLength(50)]
public string CentName { get; set; }
[StringLength(50)]
public string curr_abbrivation { get; set; }
[StringLength(50)]
public string en_curr_name { get; set; }
[StringLength(50)]
public string en_centname { get; set; }
}
public class test1 : Currencys
{
static List<test1> _currenciesList;
public static void Fill()
{
if (_currenciesList != null)
{
_currenciesList.Clear();
}
_currenciesList = new List<test1>();
using (var context = new ContextFormeDb())
{
var list = context.Currencies.ToList();
list.ForEach(o=>
{
test1 _test1 = new test1();
_test1.Curr_Id = o.Curr_Id;
_test1.Curr_Name = o.Curr_Name;
_test1.CentName = o.CentName;
_test1.curr_abbrivation = o.curr_abbrivation;
_test1.en_curr_name = o.en_curr_name;
_test1.en_centname = o.en_centname;
_currenciesList.Add(_test1);
});
}
}
}
还有什么比这更好的了吗?没有循环
list.ForEach(o=>
{
test1 _test1 = new test1();
_test1.Curr_Id = o.Curr_Id;
_test1.Curr_Name = o.Curr_Name;
_test1.CentName = o.CentName;
_test1.curr_abbrivation = o.curr_abbrivation;
_test1.en_curr_name = o.en_curr_name;
_test1.en_centname = o.en_centname;
_currenciesList.Add(_test1);
});
解决方法
还有什么比这更好的了吗?没有循环?
这取决于您会如何称呼更好。快点?可能不会。反正不多。更容易阅读和理解,更易于测试,调试,更改,重用?可能。
没有循环?某处一定有一个循环,但是它可以隐藏在LINQ语句中。
每当您想使用实体框架从数据库中获取项目,而又不想更新所获取的项目时,请始终使用Select
,并仅选择计划使用的属性。不要获取完整的项目,也不要使用Include
。这将花费您开销,只有在更新获取的数据时才会使用。
所以代替:
var result = dbContext.Schools
.Where(school => school.Name == "Hogwarts")
.Include(school => school.Students)
.ToList();
考虑使用:
var result = dbContext.Schools
.Where(school => school.Name == "Hogwarts")
.Select(school => new
{
// Select only the properties that you plan to use
Id = school.Id,Name = school.Name,...
students = dbContext.Students
.Where(student => student.SchoolId == school.Id)
.Select(student => new
{
Id = student.Id,Name = student.Name,...
// not needed,you know the value
// SchoolId = student.SchoolId,})
.ToList(),})
.ToList();
- 这将防止您不使用的财产的转移
- 这将防止将获取的数据复制到
DbContext.ChangeTracker
。 如果您不将不会更改的数据放入ChangeTracker中,那么SaveChanges
会更快。
因此,在您的情况下,如果您使用Select
,则代码将更易于理解,更易于重用,更易于测试和调试,并且无需“为每个”:
var fetchedData = dbContext.Currencies
.Where(currency => ...) // if you don't want all currencies
.Select(currency => new
{
// Select only the properties that you plan to use:
Id = currency.Id,Name = currency.Name,...
})
.ToList();
我使用了匿名类型(new
,但未指定类)。这样,您将不必创建“虚拟”类。好处是您只需编写属性,便拥有对象,甚至拥有“按值相等”。如果将来您需要添加或删除属性,则只需做就可以了,而不会出现任何问题,而无需更改您的虚拟类。
缺点:您不能在当前块之外使用它,当然也不能将其用作过程的返回值。
因此,如果您在程序之外需要它:
.Select(currency => new Test1
{
// Select only the properties that you plan to use:
Id = currency.Id,...
})
.ToList(),
,
如果两个列表属于同一类型,则可以使用AddRange。
如果不是,并且出于任何原因需要映射属性或其不同的对象类型,我建议在应用程序中配置AutoMapper,这样您就可以轻松地将List从Type A转换为Type B,然后使用AddRange
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。