c# - Linq Left Outer Join With latest datetime 在右侧

标签 c# .net linq left-join

我有一个“Orders”表,它的主键是“OrderId”:

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

和主键为“OrderDetailsId”的“OrderDetails”表,外键为“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 代码完成此任务

最佳答案

我不确定 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

关于c# - Linq Left Outer Join With latest datetime 在右侧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33102205/

相关文章:

c# - WCF 服务在 30 秒内失败并出现 1 小时超时

c# - 如何仅将数据库的模式放入数据集中?

.net - ASP .NET - Eval() 背后发生了什么?

c# - XDocument 的简单搜索

c# - 拆分和组合两个不同的字符串

c# - 存储过程或通过 IQueryable 计算?

c# - 如何将计量使用情况发送到 AppDirect

c# - 将依赖注入(inject)添加到 MVVM 应用程序

c# - .Net 中的方法重载成本

c# - 在 Linq 中使用 OrderBy