在Entity Framework中编写查询的最佳方法是什么

时间:2012-02-07 06:56:55

标签: c# linq entity-framework

明智地编写查询性能的最佳方法是什么。例如我可以编写查询以获取具体姓氏的所有雇员,如下所示

ObjectQuery<Employee> queryEmp =
    context.CreateQuery<Employee>(
    "Select value e from Employees AS e Where e.LastName = @lastName",
    new ObjectParameter("lastName", typeof(String)) { Value = "Farooqi" });
ObjectResult<Employee> results = query.Execute(MergeOption.AppendOnly);

OR

var v = from e in context.Employees where e.LastName == "Farooqi" select e;

OR

context.Employees.Where(e => e.LastName == "Farooqi");

OR

context.Employees.Where("LastName = @lastName", new ObjectParameter("lastName", typeof(String)) { Value = "Farooqi" });

我的问题是,哪种查询方法最好。 我感到困惑的是,我认为(但不确定)使用除了第一个方法之外的最后三个方法将从数据库中获取员工的所有记录,然后通过枚举将被回收的所有记录来满足指定的where条件,所以我认为最后三种方式比第一种方式花费更多时间,所以我只使用第一种方式。 但实际上最好的是什么我不知道。 是否所有方法都只获取记录表格数据库,该数据库满足条件或从db获取所有记录,然后在应用程序端枚举返回过滤后的记录?

1 个答案:

答案 0 :(得分:9)

差别不大;第二个/第三个具有在编译时强制类型正确性的优点,因为如果LastName不存在或者(比如说)int,表达式树将无法编译 - 避免拼写错误“魔术弦”的问题。

重新考虑将所有东西带回来;没有。第二个/第三个编译为表达式树,可以解构并用于创建正确的SQL(在服务器上执行过滤器)。非常聪明,但经常被误解。关键点在于Queryable.Where(取Expression<Func<T, bool>>),而非Enumerable.Where(取Func<T, bool>)。随意进行追踪。

同样,第一个/第四个之间几乎没有差别 - 两个都将在服务器上过滤。