以下代码生成运行时错误,我不知道为什么。
from o in Orders
group o by o.Employee into employeeOrders
select new {
employeeOrders.Key.EmployeeID,
employeeOrders.Key.FirstName,
Orders =
from eord in employeeOrders
orderby eord.OrderID
select new {
eord.OrderID,
eord.OrderDate,
OrderTotal=eord.OrderDetails.Sum (od => od.UnitPrice)
}
}
错误是
成员访问'LINQPad.User.OrderDetails'的'System.Decimal UnitPrice'在类型'LINQPad.User.Orders
上不合法我也在VS2010中尝试过使用标准的拖放数据上下文和同样的事情。
提前致谢
答案 0 :(得分:0)
我目前无法完全解释它(我从调试器中得不到我需要的信息),但是从我在msdn中看到的并尝试了一点,看起来没有let,未加载表示EntitySet<OrderDetail>
上OrderDetail
属性的Orders
(因为EntitySet用于延迟加载),因此无法访问。
现在让我们直接调用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,$&lt;&gt; h__TransparentIdentifier0.eord是let定义的变量)
不允许
.Call System.Linq.Enumerable.Sum(
$eord.Order_Details,
.Lambda #Lambda5<System.Func`2[northwindtest.Order_Detail,System.Decimal]>))
请注意,这只是解释。 let评估EntitySet
上的子查询,通过这填充数据( - &gt;延迟加载)。这使我们能够使用数据,甚至在let声明的变量之外(再次,延迟加载)。我不知道为什么这样做是因为我似乎无法在表达式树的不同阶段获得EntitySet<OrderDetail>
的状态。
Exception是由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);
}
经过长时间的表达式翻译。从中得出结论,如果没有somesort的子查询,就不可能将表达式树渲染到sql。为什么它不能自己做呢?我没有线索。我不认为我可以进一步分析它,我真的不知道这是否是真正的原因,也许可以请某人在MS更清楚(并且可能是正确的 winks )解释
希望我至少可以帮助一下。 FEMA