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
;
【讨论】:
这是 throwNullReferenceException
, lav 为空。
什么是pContext
和vContext
?它只是一个列表?
pContext & vContext 他们正在等待列表来自外部服务并且他们返回数据,pContext 有一个 Id 匹配的 vContext 中的 id,如果它们匹配或不匹配,我想显示这些拖链列表中的连接数据.当我解除左连接只获取链接数据时,以上是关于Linq:选择不同的对象左连接的主要内容,如果未能解决你的问题,请参考以下文章