c# - LINQ - 具有可为空值的多个左联接

标签 c# sql-server linq

我正在尝试将以下 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()

最佳答案

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

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

关于c# - LINQ - 具有可为空值的多个左联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38397957/

相关文章:

c# - TransactionScopeOptions.Suppress 超时

c# - C# 项目的目标是 ".NetFramework, Version=v4.5,Profile=Unity Full v3.5",它没有安装在这台机器上

SQL:内连接两个海量表

c# - 默认情况下是否编译了 LINQ to Entities 4.0 查询?

c# - 在集合中找不到参数 "@Name"

c# - 为了解决 GA 问题而构建可靠的服务与 Actor

sql-server - 不使用 DTU 的 Azure SQL Server JSON

java - 在其他计算机上运行时导出的 .jar 给出 "No suitable driver found for jdbc"

c# 使用 linq 获取具有相同值的对象元素

c# - NHibernate:将现有对象与新对象相关联?