【问题标题】:LINQ - Multiple left joins with nullable valuesLINQ - 具有可为空值的多个左连接
【发布时间】:2016-07-15 22:33:01
【问题描述】:

我正在尝试将以下 SQL 查询转换为 LINQ,但我收到“未设置对象实例的对象引用”。

SQL查询

SELECT a.ID_TARGET,a.TARGET_NAME, b.OBJECTIVE_NAME, c.PERSPECTIVE_NAME FROM IL_OPR_MTR_TGT AS a
LEFT JOIN IL_OPR_MTR_OBJ b ON a.TARGET_OBJECTIVE_ID = b.ID_OBJECTIVE
LEFT JOIN IL_OPR_MTR_PRSPCT c ON b.OBJECTIVE_PERSPECT_ID = c.PERSPECTIVE_ID;

SQL 输出

ID_TARGET |TARGET_NAME  |OBJECTIVE_NAME |PERSPECTIVE_NAME
----------|-------------|---------------|----------------
    7     |TGT_01       |   TST02       |PERSPECTIVE_01
    8     |TGT01        |   TST02       |PERSPECTIVE_01
    9     |TARGET_02    |   TST02       |PERSPECTIVE_01
    10    |TARGET003AA  |   (null)      |(null)

LINQ 查询

var data = (from a in allTargets
join b in allObjectives on a.TARGET_OBJECTIVE_ID equals b.ID_OBJECTIVE into partial1
from b in partial1.DefaultIfEmpty()
join c in allPerspectives on b.OBJECTIVE_PERSPECT_ID equals c.PERSPECTIVE_ID into partial2
from c in partial2.DefaultIfEmpty()
select new
{
    ID_TARGET = a.ID_TARGET,
    TARGET_NAME = a.TARGET_NAME,
    OBJECTIVE_NAME = b != null ? b.OBJECTIVE_NAME : "",
    PERSPECTIVE_NAME = c != null ? c.PERSPECTIVE_NAME : ""
}).ToList();

我想问题出在这里,因为我试图加入两个 NULL 值,但我不知道如何解决这个问题......

join c in allPerspectives on b.OBJECTIVE_PERSPECT_ID equals c.PERSPECTIVE_ID into partial2
from c in partial2.DefaultIfEmpty()

【问题讨论】:

  • 我认为问题在于您通过“a”和“b”名称引用数据,而您的所有数据都在最后一个 partial2 Enumerable 集合中,因此您应该通过"c" 你的项目集合的别名..
  • 什么是allTargets?看着异常,好像是一些内存收集?如果是 IQueryable (LINQ to Entities),您的查询将不会出现任何问题。

标签: c# sql-server linq


【解决方案1】:

您必须在查询中对 b 进行空值检查,例如:

join c in allPerspectives on (b == null ? "no-value" : b.OBJECTIVE_PERSPECT_ID) equals c.PERSPECTIVE_ID

【讨论】:

  • 非常感谢你,leetibbett!像魅力一样工作!
【解决方案2】:

您也可以尝试实例化一个新对象,而不是使用default,即null。语法类似于partial1.DefaultIfEmpty(new AllObjective())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2010-09-09
    • 2012-01-08
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多