【问题标题】:LINQ Conditional Composite key in INNER JOININNER JOIN 中的 LINQ 条件复合键
【发布时间】:2015-10-29 15:44:34
【问题描述】:

假设我有一个 Order 和 OrderDetails 集合。如何在 LINQ 中编写以下 sql(查询或流利的语法)?

选择前 1 个 OD.ProductId
从订单 O
OD.OrderID = 1 上的内部连接 ​​OrderDetail OD
and OD.OrderId = O.OrderId
and ((OD.OrderDate = O.OrderDate) or (OD.OrderDate is null))
其中 O.CustomerId = 2
按 OD.OrderDate 顺序排序

我知道我可以创建一个匿名类型,其中包含要匹配的所有列以进行连接,但是如何为内部连接编写条件逻辑,如上所述 BOLD

【问题讨论】:

  • 它不一定是连接的一部分。你可以写一个简单的Where。
  • 嗨格特谢谢。请问可以提供示例代码吗?
  • @SyedDanish:这应该是一个微不足道的查询转换,所以很难知道你遇到了什么困难。您能否向我们展示您已经编写的 LINQ 代码,以及您遇到困难的具体部分?
  • @StriplingWarrior,我基本上是在问是否可以在 linq 连接中对“复合键”进行“条件”比较?可能是我发布的示例不适合该目的,并且可以在不使用连接的情况下在 Linq 中重写,但是我会更新我的问题以使其更清楚。

标签: c# linq join linq-to-entities inner-join


【解决方案1】:

您的查询将给出相同的结果:

select top 1 OD.ProductId
from Order O
inner join OrderDetail OD
  on OD.OrderId = O.OrderId
where O.CustomerId = 2
  and OD.OrderID=1
  and (OD.OrderDate is null or OD.OrderDate=O.OrderDate)
order by OD.OrderDate desc

您应该能够更轻松地将其转换为 LINQ。

var results=db.OrderDetail
  .Where(od=>od.Order.CustomerId==2)
  .Where(od=>od.OrderId==1)
  .Where(od=>od.OrderDate==null || od.OrderDate==od.Order.OrderDate)
  .OrderBy(od=>od.OrderDate)
  .Select(od=>od.ProductId)
  .First();

您可以进一步简化为:

var results=db.OrderDetail
  .Where(od=>od.Order.CustomerId==2 &&
    (od.OrderId==1) &&
    (od.OrderDate==null || od.OrderDate==od.Order.OrderDate))
  .OrderBy(od=>od.OrderDate)
  .Select(od=>od.ProductId)
  .First();

【讨论】:

  • 嗨罗伯特,谢谢。我接受您的回答,因为它对于我提到的场景是正确的,但是我仍然有兴趣知道如何在条件逻辑是“加入”条件的一部分并且不能在“Where”子句中编写的情况下编写 LINQ 等效项。也许我应该用特定的代码示例问一个不同的问题。
猜你喜欢
  • 2019-06-04
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多