Linq:选择不同的对象左连接

Posted

技术标签:

【中文标题】Linq:选择不同的对象左连接【英文标题】:Linq : Select Different Object Left Join 【发布时间】:2022-01-13 17:40:16 【问题描述】:

我有两个合同和一个查询,我想根据连接结果选择其中一个,而不使用 where 子句,

from a in pContext
     join c in vContext 
       on a.id equals c.id into av 
     from lav in av.DefaultIfEmpty()
if(lav != null )

   select new DTO1()
  
   a.id,
   a.name,
   lav.description
  

else

 select new DTO2()
 
  a.id,
  a.name
 

【问题讨论】:

lav 是一个对象,你认为它与零相比如何? 这不是 null ,这是我的错,因为如果 lav 为 null 则抛出 NullReferenceException ,我使用过 lav.description != null ? lav.description : "未找到" 但没用。 如果是 EF Core,你可以使用第一个表达式,EF Core 会处理空值。在其他情况下,您必须使用三元运算符? : 我使用了三元运算符,但它抛出了NullReferenceException 所以发布真正的查询,而不是这个简化的演示。你错过了重要的部分。 【参考方案1】:
from a in pContext
     join c in vContext 
       on a.id equals c.id into av 
     from lav in av.DefaultIfEmpty()
  select new DTO()
  
   id = a.id,
   name = a.name,
   description = lav != null ? lav.description : "No Specified"
  

该解决方案基于 Svyatoslav Danyliv 评论,使用三元运算符但有不同的条件以避免NullReferenceException

【讨论】:

【参考方案2】:

EF Core 将 LINQ“左连接”转换为 SQL 左连接,在这种情况下您不需要处理空值,因为它需要来自 DbDataReader 的值。简单的投影应该可以工作:

var query =
    from a in pContext
    join c in vContext on a.id equals c.id into av 
    from lav in av.DefaultIfEmpty()
    select new DTO1
    
        a.id,
        a.name,
        lav.description
    ;

【讨论】:

这是 throw NullReferenceException , lav 为空。 什么是pContextvContext?它只是一个列表? pContext & vContext 他们正在等待列表来自外部服务并且他们返回数据,pContext 有一个 Id 匹配的 vContext 中的 id,如果它们匹配或不匹配,我想显示这些拖链列表中的连接数据.当我解除左连接只获取链接数据时,

以上是关于Linq:选择不同的对象左连接的主要内容,如果未能解决你的问题,请参考以下文章

LINQ:从左连接填充对象

LINQ 内连接与左连接

使用扩展方法/查询语法在 LINQ 中需要左外连接

Linq 和 SQL的左连接右连接内链接

LINQ的左连接右连接内连接

LINQ的左连接右连接内连接