具有 Linq 和默认值的多个左连接

Posted

技术标签:

【中文标题】具有 Linq 和默认值的多个左连接【英文标题】:Multiple Left Join with Linq and Defaults Values 【发布时间】:2021-09-27 12:22:22 【问题描述】:

我正在尝试在 c# .netcore 2.2 应用程序的 linq 中编写一个包含多个左连接的查询。我已经尝试在 linq 中编写查询,但它没有正确检索所有行。我正在尝试转换的查询如下。

  select   ISNULL(b.Id, '00000000-0000-0000-0000-000000000000') as 'Bat Id', p.Id as 'ProductId',  p.RP, u.UnitName as 'UnitName', ISNULL(b.QTY,0) as 'BusQty', p.[Name] as 'Product Name'
  from  Products p left join Bat b
  ON p.Id = b.ProductId
  left join Units u on p.UOId = u.Id;

我到目前为止的linq

var allProducts = (from p in _db.Products
             join s in _db.Bat on p.Id equals s.ProductId into ps
             from s in ps.DefaultIfEmpty()
            join u in _db.Units on p.UOId equals u.Id
            select new
             
           BatId = s.Id == null ? Guid.NewGuid() : s.Id,
          RP = p.RP,
          BusQty = s.QTY == null ? 0 : s.QTY,
          ProductName = p.Name,
          UnitName = u.UnitName,
          ProductId = p.Id,
         ).ToList();

【问题讨论】:

到目前为止你有什么 LINQ 代码? @Charlieface 将我的 linq 添加到问题中 【参考方案1】:

您在Units 上缺少DefaultIfEmpty(),从而将其变成了内连接

var allProducts = (
         from p in _db.Products
         join s in _db.Bat on p.Id equals s.ProductId into ps
         from s in ps.DefaultIfEmpty()
         join u in _db.Units on p.UOId equals u.Id into us
         from u in us.DefaultIfEmpty()
         select new
         
          BatId = s.Id ?? Guid.NewGuid(),
          RP = p.RP,
          BusQty = s.QTY ?? 0,
          ProductName = p.Name,
          UnitName = u.UnitName,
          ProductId = p.Id,
         ).ToList();

【讨论】:

以上是关于具有 Linq 和默认值的多个左连接的主要内容,如果未能解决你的问题,请参考以下文章

Linq to Entity 具有多个左外连接

使用 Linq 执行具有多个值的包含

Linq 中默认值的平均扩展方法

使用 LINQ 将具有相同值的多行列表连接成单行

C# Linq 对重复值的完全外连接

具有多个默认值的Javascript Switch语句