我目前无法完全解释它(我没有从调试器中获得我需要的信息),但是从我在 msdn 中看到的并尝试了一下,显然,没有 let,EntitySet<OrderDetail>
代表OrderDetail
属性 onOrders
未加载(因为 EntitySet 用于延迟加载),因此无法访问。
let 现在直接调用 EntitySet 并因此启用查询。这也与 H. Holterman 的评论一起出现。
我会尝试找到一个更复杂的解释。
编辑
两者的区别在于:
让
.Call System.Linq.Enumerable.Sum(
($<>h__TransparentIdentifier0.eord).Order_Details,
.Lambda #Lambda6<System.Func`2[northwindtest.Order_Detail,System.Decimal]>))
(Lambda6是Sum中的lambda,$<>h__TransparentIdentifier0.eord是let定义的变量)
不让
.Call System.Linq.Enumerable.Sum(
$eord.Order_Details,
.Lambda #Lambda5<System.Func`2[northwindtest.Order_Detail,System.Decimal]>))
请注意,这仅是解释。letEntitySet
通过用数据填充它来评估 上的子查询(-> 延迟加载)。这使我们能够使用数据,甚至在 let 声明的变量之外(同样,延迟加载)。我不知道为什么会这样,因为我似乎无法获得EntitySet<OrderDetail>
表达式树不同阶段的状态。
异常是由 System.Data.Linq.SqlClient.SqlMember.Expression.Set 中的代码引起的
if (!this.member.ReflectedType.IsAssignableFrom(value.ClrType) && !value.ClrType.IsAssignableFrom(this.member.ReflectedType))
{
throw Error.MemberAccessIllegal(this.member, this.member.ReflectedType, value.ClrType);
}
经过一长排的表达式翻译。由此我得出结论,如果没有某种子查询,就不可能将表达式树渲染为 sql。为什么它自己不这样做?我没有线索。我认为我无法进一步分析它,我真的不知道这是否是真正的原因,也许可以向 MS 的某个人寻求更清晰(并且可能是正确的眨眼)的解释。
希望我至少能帮上一点忙。女性