Linq Left Outer Join With 最新日期时间在右侧
Linq Left Outer Join With newest datetime in right side
我有 "Orders" table 其主键是 "OrderId ":
OrderId | OrderName
------- | ----------
1 | Order X
2 | Order Y
3 | Order Z
和 "OrderDetails" table 其中主键是 "OrderDetailsId " 外键是 'OrderId":
OrderDetailsId | OrderId | ItemId | DeliveryDate
-------------- | ------- | ------ | ------------
10 | 1 | AA | 1/1/2010
20 | 1 | BB | 1/1/2013
30 | 2 | CC | 1/1/2012
40 | 2 | CC | 1/1/2014
每个订单都有零个或多个订单详细信息,每个订单详细信息都有具体的交货日期。
我们想要获取所有的订单,无论它们是否有订单详情,如果订单详情的最大值为 "delivery date"
,则只将一个订单标记为 VIP
这是预期的输出:
OrderId | OrderName | IsVIP
------- | --------- | -----
1 | Order X | NO
2 | Order Y | YES
3 | Order Z | NO (since it has no order details)
这是因为最大交货日期是 OrderDetailsId = 40 属于 OrderId = 2
如何使用最易读的 LINQ 代码完成此操作
使用导航属性。请注意,对于包含最大交货日期的订单详细信息的所有订单,这会将 IsVIP
设置为 "YES"。
var query = from order in db.Orders
select new
{
order.OrderId,
order.Name,
IsVIP = order.OrderDetails.Any(
od => od.DeliveryDate == db.OrderDetails.Max(x => x.DeliveryDate))
? "YES"
: "NO"
};
我不确定 orders
集合中是否有 OrderDetails
属性(如果有,那么@juharr 的回答是正确的)。但是,如果不是,那么您可以像这样使用 group join
:-
var result = from o in orders
join od in orderDetails
on o.OrderId equals od.OrderId into g
select new {
OrderId = o.OrderId,
OrderName = o.OrderName,
IsVIP = g.Any(x => x.DeliveryDate == orderDetails.Max(z => z.DeliveryDate))
? "Yes" : "No"
};
这里有一个 Fiddle 和 linq-to-objects
的例子。
我有 "Orders" table 其主键是 "OrderId ":
OrderId | OrderName
------- | ----------
1 | Order X
2 | Order Y
3 | Order Z
和 "OrderDetails" table 其中主键是 "OrderDetailsId " 外键是 'OrderId":
OrderDetailsId | OrderId | ItemId | DeliveryDate
-------------- | ------- | ------ | ------------
10 | 1 | AA | 1/1/2010
20 | 1 | BB | 1/1/2013
30 | 2 | CC | 1/1/2012
40 | 2 | CC | 1/1/2014
每个订单都有零个或多个订单详细信息,每个订单详细信息都有具体的交货日期。
我们想要获取所有的订单,无论它们是否有订单详情,如果订单详情的最大值为 "delivery date"
,则只将一个订单标记为 VIP这是预期的输出:
OrderId | OrderName | IsVIP
------- | --------- | -----
1 | Order X | NO
2 | Order Y | YES
3 | Order Z | NO (since it has no order details)
这是因为最大交货日期是 OrderDetailsId = 40 属于 OrderId = 2
如何使用最易读的 LINQ 代码完成此操作
使用导航属性。请注意,对于包含最大交货日期的订单详细信息的所有订单,这会将 IsVIP
设置为 "YES"。
var query = from order in db.Orders
select new
{
order.OrderId,
order.Name,
IsVIP = order.OrderDetails.Any(
od => od.DeliveryDate == db.OrderDetails.Max(x => x.DeliveryDate))
? "YES"
: "NO"
};
我不确定 orders
集合中是否有 OrderDetails
属性(如果有,那么@juharr 的回答是正确的)。但是,如果不是,那么您可以像这样使用 group join
:-
var result = from o in orders
join od in orderDetails
on o.OrderId equals od.OrderId into g
select new {
OrderId = o.OrderId,
OrderName = o.OrderName,
IsVIP = g.Any(x => x.DeliveryDate == orderDetails.Max(z => z.DeliveryDate))
? "Yes" : "No"
};
这里有一个 Fiddle 和 linq-to-objects
的例子。