2011-12-11 229 views
0

我正在使用Include扩展来实现LINQ to Entity。以多对一和一对多的关系实现LINQ to Entity

我有以下方案:

enter image description here

这是我的第一个LINQ(它工作正常):

var query = ctx1.Order_Details.Include("Order").Select(o => new 
      { o.OrderID, 
       o.ProductID, 
       o.Order.OrderDate, 
       o.Order.OrderNumber 
       }); 

这里是我的第二LINQ(不工作):

Error Cannot convert lambda expression to type 'string' because it is not a delegate type

我的问题是为什么当我在“多对一”关系中实现Linq时LINQ可以正常工作,并且当我尝试实现LINQ“从内到外”时一对多)它不起作用?

回答

2

第一个查询工作,因为只有一个为每个订单细节相关订单 - 你正在寻找从“N”的观点(顺序的关系细节)。

在你在1开始与“1”的第二个查询:N的关系秩序和Order_Detail和你之间试图让一个单价 - 但有一个集合(以下简称“N” )的相关联合价格和数量。您目前的方法只适用于每个Order只有一个相关的Order_Detail

如果你想抓住相关的单价和数量的集合在你的匿名类型,你可以做这样的事情:

var query2 = ctx1.Order.Include("Order_Details").Select(o => new 
      { o.OrderID, 
       o.CustomerID, 
       UnitPrices = o.Order_Details.Select(od => od.UnitPrice), 
       Quantities = o.Order_Details.Select(od => od.Quantity) 
       }); 
+0

BrokenGlass,谢谢你的回答,它是真的阻止了我,但钢铁缺少的东西。在我的第二个LINQ你写的结果得到一个UnitPrice和一个QUANTITY.BUT为什么?我没有使用我的LINQ过滤器或扩展方法,如.first()或.last()。我有点困惑,也许是因为我不明白LINQ如何工作。请你! – Michael

+0

我说*你正在尝试*获得一个UnitPrice - 这就是为什么它不起作用 - 你将Order_Details当作单个对象处理,但它是一个集合 – BrokenGlass

0

只是一个猜测,但如何:

ctx1.Orders.... //not ctx1.Order 
+0

花钱,后多元化的,我得到2个另一个错误。 – Michael