FirstOrDefault方法的EF 4.0 /怪异的行为

我正在开发使用EF 4.0和POCO一个小应用程序。

在测试我的应用程序,我从小关心的数据访问层的性能。 所以我解雇了SQL事件探查器看到,当试图检索的记录:

ctx.Orders.Include("OrderItems").FirstOrDefault<Order>(c => c.OrderID == id);

在EF发出一个SQL语句,将检索服务器上,因此回归到DAL届时L2E会选择一个大公符合标准并返回Orders表中的所有记录。

可这种行为被改变。

谢谢!

--------------解决方案-------------

试试这个,请:

ctx.Orders.Include("OrderItems").Where(c => c.OrderID == id).FirstOrDefault();

顺便说一句,你不需要考虑SQL事件探查器来查看生成的SQL,您可以通过书面形式做是正确的代码内:

IQueryable<Order> query = ctx.Orders.Include("OrderItems")
.Where(c => c.OrderID == id);
string sql = ((ObjectQuery<Order>)query).ToTraceString();

编辑:
问题:如果我们有像FindOrders功能,我们需要的谓词传递给这个功能呢? 答:代码应该是这样的:

public List<Order> FindOrders(Expression<Func<Order, bool>> predicate) {
using (DBContext ctx = new DBContext()) {
return ctx.Orders.Include("OrderItems").Where(predicate).ToList<Order>();
}
}

//Calling the function:
var order = FindOrders(c => c.OrderID == id)[0];

这个时候,如果你检查你的SQL事件探查器,你会看到有一个在那里已经提交到SQL Server这就是SQL子句。

说明:
这样做的原因“怪异行为”是,基本上当你写在哪里(C => c.OrderID == ID),C#编译器投你的Lambda表达式插入表达<Func键<TSource,INT,BOOL >>而不是一个FUNC <TSource,整型,布尔>。

MSDN文档Queryable.Where也证实了这一点:

public static IQueryable<TSource> Where<TSource>(
this IQueryable<TSource> source,
Expression<Func<TSource, int, bool>> predicate
)

但是,如果你明确地传递函数求<TSource,INT,BOOL >>给Where方法,那么你基本上调用Enumerable.Where:

public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, int, bool> predicate
)

正如我们所知道IEnumerable.Where是“LINQ到对象”的实施,而不是“LINQ到实体”,这意味着成盎司你达到你的IEnumerable.Where电话,的ObjectQuery运行初始查询(ctx.Orders.Include(“的OrderItems”) )并给出了结果向IEnumerable.Where以便它将过滤它为你客户端上的。

而另一方面与Queryable.Where通话(ctx.Orders.Include(“的OrderItems”)。将(C => c.OrderID == ID).FirstOrDefault())将不会被直到它执行达到如此地步,我们称之为FirstOrDefault()函数,这意味着Queryable.Where被翻译成原生SQL以及查询的其余部分,将被传递到SQL Server,所以你看到的SQL语句这绝对是需要的运行Where子句行为。

对了,不要忘记导入这个命名空间类文件:

using System.Linq.Expressions;

分类:实体框架4 时间:2015-03-16 人气:7
本文关键词: 实体框架4
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.213 (s). 10 q(s)