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

问题描述

我正在尝试在 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();

解决方法

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

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