实体框架中子列表的Join vs Navigation属性

时间:2013-05-24 17:35:40

标签: c# .net linq entity-framework navigation-properties

我有一个像这样的sql语句:

DECLARE @destinations table(destinationId int)
INSERT INTO @destinations
VALUES (414),(416)

SELECT *
FROM GroupOrder grp (NOLOCK)
          JOIN DestinationGroupItem destItem (NOLOCK)
                    ON destItem.GroupOrderId = grp.GroupOrderId
          JOIN @destinations dests
                    ON destItem.DestinationId = dests.destinationId
WHERE OrderId = 5662

我正在使用实体框架,我很难将此查询带入Linq。 (我上面写这个查询的唯一原因是帮助我概念化我要找的东西。)

我有一个IQueryable的GroupOrder实体和一个作为我的目的地的整数列表。

看了这个后,我意识到我可能只做两个连接(比如我的SQL查询)并得到我想要的东西。

但这样做有点奇怪,因为GroupOrder对象已经有一个DestinationGroupItem对象列表。

当我有一个IQOeryable GroupOrders列表时,我有点困惑如何在GroupOrder上使用Navigation属性。

另外,如果可能的话,我想在一次数据库中这样做。 (我想我可以做一些foreach循环来完成这项任务,但它不会像单个IQueryable运行到数据库那样有效。)

注意:我更喜欢流畅的linq语法而不是查询linq语法。但乞丐不能选择,所以我会采取我能得到的任何东西。

1 个答案:

答案 0 :(得分:3)

如果您已将DestinationGroupItem作为Navigation属性,那么您已经拥有了SQL-JOIN等效项 - example。使用Include加载相关实体。使用List的Contains扩展方法来查看是否命中了所需的DestinationId:

var destinations = new List<int> { 414, 416 };
var query = from order in GroupOrder.Include(o => o.DestinationGroupItem) // this is the join via the navigation property
            where order.OrderId == 5662 && destinations.Contain(order.DestinationGroupItem.DestinationId)
            select order;
// OR
var query = dataContext.GroupOrder
            .Include(o => o.DestinationGroupItem)
            .Where(order => order.OrderId == 5662 && destinations.Contain(order.DestinationGroupItem.DestinationId));