【发布时间】:2015-08-20 11:34:44
【问题描述】:
在 Linq to Entity 中,.AsExpandable() 究竟做了什么?在哪里以及为什么要使用它?它是否将所有相关实体都包含在查询中以进行延迟加载?
【问题讨论】:
标签: linq entity-framework lambda
在 Linq to Entity 中,.AsExpandable() 究竟做了什么?在哪里以及为什么要使用它?它是否将所有相关实体都包含在查询中以进行延迟加载?
【问题讨论】:
标签: linq entity-framework lambda
Entity Framework 的查询处理管道无法处理调用表达式,这就是您需要在查询中的第一个对象上调用 AsExpandable 的原因。通过调用 AsExpandable,您可以激活 LINQKit 的表达式访问者类,该类将调用表达式替换为 Entity Framework 可以理解的更简单的构造。
— Josef Albahari
有关更多详细信息,我建议阅读author of LinqPad
【讨论】:
.Invoke() 方法的实际含义,也不知道如何翻译它。 .AsExpandable()(和 .Expand())所做的是遍历表达式树,并在 EF 到达之前将 .Invoke() 的任何实例与其调用的实际表达式树交换。这样,EF 只能看到没有.Invoke()s 的“普通”表达式树。
没有从方法组到表达式(对应的委托类型)的隐式转换。从方法组到匹配签名的委托存在隐式转换。因此只有 IEnumerable 重载匹配。
当然,这并不是说您需要使用 lambda。随便写:
ctx.Set().AsExpandable().Where(ByName); 由于您正在传递一个表达式(毕竟,ByName 已经是一个表达式,这正是 Queryable.Where 所需要的),这将作为一个查询进行评估,而不是在 linq 中对对象进行评估。
【讨论】: