Linq Left Outer Join右侧最新日期时间

时间:2015-10-13 12:02:18

标签: c# .net linq left-join

我有“Orders”表,其主键是“OrderId”:

OrderId | OrderName
------- | ----------
1       | Order X
2       | Order Y  
3       | Order Z

和“OrderDetails”表,其主键是“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

每个订单都有零或更多订单详细信息,每个订单明细都有具体的交货日期。

我们希望获得所有订单,无论是否有订单明细,如果订单明细具有最大“交货日期”,则只标记一个订单作为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代码实现此目的

2 个答案:

答案 0 :(得分:3)

我不确定你是否在map.on('singleclick', myfunc); var myfunc = function(evt) { map.getTargetElement().style.cursor = 'wait'; // do some lengthy processing map.getTargetElement().style.cursor = 'pointer'; } 集合中拥有OrderDetails属性(如果是,那么@ juharr的答案是正确的)。但是,如果不是,那么你可以像这样使用orders: -

group join

以下是Fiddle 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" }; 的示例。

答案 1 :(得分:2)

使用导航属性。请注意,对于包含最大投放日期的订单明细的所有订单,这会将IsVIP设置为“是”。

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"
            };