首页 > 解决方案 > 具有多个条件的 SQL to LINQ 左外连接

问题描述

我在 LINQ 中使用多个条件来解决这个左外连接问题。我的初始 SQL 语句如下。

SELECT DISTINCT [Product].[prod_id],
    [Product].[brd_id],
    [Product].[prod_brdId],
    [Size].[size_id],
    [Size].[size_sort],
    [Bin].[bin_rack],
    [Bin].[bin_alpha]
  
  FROM [Proddetails]
  JOIN [Prodcolor]
  ON [Proddetails].[pcl_id] = [Prodcolor].[pcl_id]
  
  JOIN [Product]
  ON [Prodcolor].[prod_id] = [Product].[prod_id]
  
  JOIN [Size]
  ON [Proddetails].[pdt_size] = [Size].[size_id]
  
  LEFT OUTER JOIN [Bin]
  ON [Product].[prod_id] = [Bin].[prod_id]
  
  ORDER BY [Product].[brd_id], [Product].[prod_brdId], [Size].[size_sort]

以及我在 .NET 中对应的 LINQ 语句

BinProds = (
from pd in applicationDbContext.Proddetails
  join pc in applicationDbContext.Prodcolors on pd.PclId equals pc.PclId
  join pr in applicationDbContext.Products on pc.ProdId equals pr.ProdId
  join sz in applicationDbContext.Sizes on pd.PdtSize equals sz.SizeId
  join bn in applicationDbContext.Bins on pr.ProdId equals bn.ProdId into ps                
  from bn in ps.DefaultIfEmpty()
  select new CoreBin
  {
    ... fields here
  }
).Distinct().OrderBy(i=>i.BrdId).ThenBy(j=>j.ProdBrdId).ThenBy(k=>k.SizeSort).ToList();

因此,这两个都分别在 SQL Server Studio 和 .NET 中成功执行。但是,它并没有给我我正在寻找的确切结果,因为它在 LEFT OUTER JOIN 上缺少一个附加条件。下面是我对 SQL 语句所做的一项更改,它提供了我在 SQL Server Studio 中想要的内容。我只是不知道如何调整 LINQ 以在我的 .NET 项目中获得相同的结果。

LEFT OUTER JOIN [Bin]
ON [Product].[prod_id] = [Bin].[prod_id]
AND [Bin].[size_id] = [Size].[size_id]

我希望有一个合理的调整。如果您需要我的表格输出或数据库设计,请告诉我。

标签: c#sqlsql-serverlinq

解决方案


这应该给你想要的 SQL:

.....
  join bn in applicationDbContext.Bins 
     on new { pr.ProdId, sz.size_id } equals new { bn.ProdId, bn.size_id } into ps                
  from bn in ps.DefaultIfEmpty()
  select new CoreBin
  {
    ... fields here
  }
.....

推荐阅读