1

以下代码正在生成运行时错误,我不知道为什么。

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 中使用标准的拖放数据上下文和相同的东西尝试过这个。

提前致谢

4

1 回答 1

0

我目前无法完全解释它(我没有从调试器中获得我需要的信息),但是从我在 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 的某个人寻求更清晰(并且可能是正确的眨眼)的解释。

希望我至少能帮上一点忙。女性

于 2010-05-02T21:32:41.790 回答