【发布时间】:2014-07-31 21:09:09
【问题描述】:
场景:我有一个在 .NET 4.5 上使用 EF 6.1 和 SQL Server 2012 的 Windows 控制台应用程序。
问题:我想得到一些反馈,以下哪个 LINQ 表达式是从数据库加载数据的首选方式或更有效的方式:
// Option 1: Using List<>
public List<Employee> EmployeeList
{
get { return Context.Employees.Select(e => e).ToList(); }
}
// Option 2: Using IList<>
public IList<Employee> EmployeeList2
{
get { return Context.Employees.Select(e => e).ToList(); }
}
// Option 3: Using IEnumerable<>
public IEnumerable<Employee> EmployeeList3
{
get { return Context.Employees.Select(e => e); }
}
// Option 4: Using IQueryable
public IQueryable<Employee> EmployeeList4
{
get { return Context.Employees.Select(e => e); }
}
// Option 5: Using IQueryable & AsNoTracking()
public IQueryable<Employee> EmployeeList5
{
get { return Context.Employees.Select(e => e).AsNoTracking(); }
}
// Option 6: Using "async/await"
public async Task<List<Employee>> GetEmployeeList6()
{
return await Context.Employees.Select(x => x).ToListAsync();
}
// Option 7: Using "using" statement
public List<Employee> GetEmployeeList7()
{
using (Context context = new Context())
{
return Context.Employees.Select(e => e).ToList();
}
}
请注意,我不需要 EF 来跟踪任何更改。我只需要将员工列表放入内存中以便我可以操作它们,这就是我将扩展方法 AsNoTracking() 添加到选项 5 的原因。
【问题讨论】:
-
自己进行基准测试。可能会有无法估量的差异。在您的
Select之后返回IEnumerable<T>的那些将是最快的,因为由于延迟执行,它们实际上并没有做任何事情。此外,using的最后一个“选项”实际上并没有使用在using块中声明的变量。
标签: c# performance linq entity-framework async-await