我有一个像这样的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语法。但乞丐不能选择,所以我会采取我能得到的任何东西。
答案 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));