INNER JOIN 中的 LINQ 条件复合键
LINQ Conditional Composite key in INNER JOIN
假设我有一个 Order 和 OrderDetails 集合。如何在 LINQ(查询或流畅语法)中编写以下 sql?
select top 1 OD.ProductId
from Order O
inner join OrderDetail OD on OD.OrderID = 1
and OD.OrderId = O.OrderId
and ((OD.OrderDate = O.OrderDate) or (OD.OrderDate is null))
where O.CustomerId = 2
order by OD.OrderDate desc
我知道我可以创建一个匿名类型,其中包含要匹配的所有列以进行连接,但是如何编写内部连接的条件逻辑,如上文 BOLD[=11 中所述=]
您的查询将给出与以下相同的结果:
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();
假设我有一个 Order 和 OrderDetails 集合。如何在 LINQ(查询或流畅语法)中编写以下 sql?
select top 1 OD.ProductId
from Order O
inner join OrderDetail OD on OD.OrderID = 1
and OD.OrderId = O.OrderId
and ((OD.OrderDate = O.OrderDate) or (OD.OrderDate is null))
where O.CustomerId = 2
order by OD.OrderDate desc
我知道我可以创建一个匿名类型,其中包含要匹配的所有列以进行连接,但是如何编写内部连接的条件逻辑,如上文 BOLD[=11 中所述=]
您的查询将给出与以下相同的结果:
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();