C# 内部联接中的LINQ条件复合密钥

C# 内部联接中的LINQ条件复合密钥,c#,linq,join,linq-to-entities,inner-join,C#,Linq,Join,Linq To Entities,Inner Join,假设我有一个订单和订单详细信息集合。如何用LINQ(查询或流畅语法)编写以下sql 选择前1个OD.ProductId 从订单O开始 OD.OrderID=1上的内部联接OrderDetail OD 和OD.OrderId=O.OrderId 和((OD.OrderDate=O.OrderDate)或(OD.OrderDate为空)) 其中O.CustomerId=2 按OD订购。订购日期说明 我知道我可以创建一个匿名类型,其中包含所有与联接匹配的列,但是如何为内部联接编写条件逻辑,如上所述,在

假设我有一个订单和订单详细信息集合。如何用LINQ(查询或流畅语法)编写以下sql

选择前1个OD.ProductId
从订单O开始
OD.OrderID=1上的内部联接OrderDetail OD
和OD.OrderId=O.OrderId
和((OD.OrderDate=O.OrderDate)或(OD.OrderDate为空))
其中O.CustomerId=2
按OD订购。订购日期说明


我知道我可以创建一个匿名类型,其中包含所有与联接匹配的列,但是如何为内部联接编写条件逻辑,如上所述,在BOLD中,您的查询将给出与以下相同的结果:

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();

它不必是连接的一部分。你可以写一个简单的地址。嗨,格特,谢谢。你能提供一个示例代码吗?@SyedDanish:这应该是一个很小的查询转换,所以很难知道你在做什么。您能告诉我们您已经编写的LINQ代码,以及您遇到困难的具体部分吗?@StriplingWarrior,我基本上是问是否可以对LINQ联接中的“复合键”进行“条件”比较?可能是我发布的示例不适合这个目的,可以在Linq中重新编写,而无需使用连接,但是我将更新我的问题以使其更清楚。嗨,罗伯特,谢谢。我接受你的回答,因为它对于我提到的场景是正确的,但是我仍然有兴趣知道,在条件逻辑是“连接”条件的一部分并且不能写在“where”子句中的情况下,我们如何编写LINQ等价物。也许我应该用一个特定的代码示例问一个不同的问题。@SyedDanish我想你会发现很难找到这样的示例,但是,另一种方法是将两个单独的查询合并在一起,每个查询都带有“or”的一部分。