【问题标题】:Linq : Select Different Object Left JoinLinq:选择不同的对象左连接
【发布时间】: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
  • 所以发布真正的查询,而不是这个简化的演示。你错过了重要的部分。

标签: entity-framework linq entity-framework-core


【解决方案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,如果它们匹配或不匹配,我想显示这些拖链列表中的连接数据.当我解除左连接只获取链接数据时,
    猜你喜欢
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2015-06-19
    • 1970-01-01
    相关资源
    最近更新 更多