4

我有一个这样的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。(我写上面的查询的唯一原因是帮助我概念化我在寻找什么。)

我有一个 GroupOrder 实体的 IQueryable 和一个整数列表,它们是我的目的地。

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

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

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

另外,如果可能的话,我想在一次访问数据库中执行此操作。(我想我可以做几个foreach循环来完成这项工作,但它不会像对数据库的单个 IQueryable 运行那样有效。)

注意:与查询 linq 语法相比,我更喜欢流利的 linq 语法。但乞丐不能挑剔,所以我会尽我所能。

4

1 回答 1

3

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

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));
于 2013-05-24T22:20:06.960 回答