LINQ 中的多个左联接

2024-04-11

我正在尝试将 SQL 查询转换为 LINQ,但无法正确获取语法。我原来的(工作的)SQL 查询是:

 SELECT a.PersonnelNumber,
    a.LastName,
    a.FirstName,
    a.MiddleInitial,
    b.Title,
    b.Division,
    b.Section,
    b.Unit,
    d.PersonnelNumber AS SupervisorPersonnelNumber
FROM Person a
     JOIN Position b ON a.PositionID = b.PositionID
     LEFT JOIN Position c ON b.SupervisorPositionID = c.PositionID
     LEFT JOIN Person d ON c.PositionID = d.PositionID

我将其转换为以下 LINQ:

var query = from a in ctx.People
            from b in ctx.Positions.Where(b => a.PositionID == b.PositionID)
            from c in ctx.Positions.Where(c => b.SupervisorPositionID == c.PositionID).DefaultIfEmpty()
            from d in ctx.People.Where(d => c.PositionID == d.PositionID).DefaultIfEmpty()
            select new { 
                            a.PersonnelNumber, 
                            a.LastName, 
                            a.FirstName, 
                            a.MiddleInitial, 
                            b.Title, 
                            b.Division, 
                            b.Section, 
                            b.Unit, 
                            SupervisorPersonnelNumber = d.PersonnelNumber
                       };

这返回的结果比我预期的要多(20000+ 而不是 ~1100),所以我查看了生成的 SQL:

SELECT 
[Extent2].[PositionID] AS [PositionID], 
[Extent1].[PersonnelNumber] AS [PersonnelNumber], 
[Extent1].[LastName] AS [LastName], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[MiddleInitial] AS [MiddleInitial], 
[Extent2].[Title] AS [Title], 
[Extent2].[Division] AS [Division], 
[Extent2].[Section] AS [Section], 
[Extent2].[Unit] AS [Unit], 
[Extent4].[PersonnelNumber] AS [PersonnelNumber1]
FROM    [dbo].[Person] AS [Extent1]
INNER JOIN [dbo].[Position] AS [Extent2] ON [Extent1].[PositionID] = [Extent2].[PositionID]
LEFT OUTER JOIN [dbo].[Position] AS [Extent3] ON [Extent2].[SupervisorPositionID] = [Extent3].[PositionID]
LEFT OUTER JOIN [dbo].[Person] AS [Extent4] ON ([Extent3].[PositionID] = [Extent4].[PositionID]) OR (([Extent3].[PositionID] IS NULL) AND ([Extent4].[PositionID] IS NULL))

最后一行是导致我的问题的原因:

LEFT OUTER JOIN [dbo].[Person] AS [Extent4] ON ([Extent3].[PositionID] = [Extent4].[PositionID]) OR (([Extent3].[PositionID] IS NULL) AND ([Extent4].[PositionID] IS NULL))

我不确定为什么要额外OR添加子句并删除它返回了所需的结果。

如果有帮助的话,Position表与(有效,但未强制执行)具有 1:1 关系Person and Position与自身有关系:PositionID是 FK 到SupervisorPositionID

CREATE TABLE [dbo].[Position](
[PositionID] [int] IDENTITY(1,1) NOT NULL,
[PositionNumber] [varchar](8) NULL,
[Title] [varchar](40) NULL,
[Division] [varchar](40) NULL,
[Section] [varchar](40) NULL,
[Unit] [varchar](40) NULL,
[SupervisorPositionID] [int] NULL,
)

CREATE TABLE [dbo].[Person](
[PersonID] [int] IDENTITY(1,1) NOT NULL,
[PersonnelNumber] [varchar](8) NOT NULL,
[LastName] [varchar](40) NULL,
[FirstName] [varchar](40) NULL,
[MiddleInitial] [char](1) NULL,
[PositionID] [int] NULL,
)

Why is OR (([Extent3].[PositionID] IS NULL) AND ([Extent4].[PositionID] IS NULL))被附加到该行的末尾,我可以做什么来修复它?


您需要更改 DbContext 上的设置。该物业是使用DatabaseNull语义 http://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbcontextconfiguration.usedatabasenullsemantics(v=vs.113).aspx你需要将其设置为 false

context.Configuration.UseDatabaseNullSemantics = false;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LINQ 中的多个左联接 的相关文章

随机推荐

  • 指数时间复杂度的真实示例

    我正在寻找一个直观的 现实世界的问题示例 该问题需要 最坏情况 指数时间复杂度来解决我正在做的演讲 以下是我提出的其他时间复杂度的示例 其中许多取自这个问题 https stackoverflow com questions 1592649
  • 检查表单是否已提交 - PHP

    检查表单是否已提交以确定是否应该将表单的变量传递给我的验证类的最佳方法是什么 首先我想也许 isset POST 但这总是会返回 true 因为超全局变量在任何地方都被定义 我不想使用以下方式迭代表单的每个元素 if isset POST
  • 如何重现错误“由于暂停纯视频背景媒体以节省电量,播放()请求被中断”?

    介绍 作为我项目的一部分 我有一个接收视频流的播放器 我希望它在流开始和结束时自动播放和自动停止 因此我引入了一个检查来查看流是否处于活动状态并在每种情况下启动和 或停止播放器 这是一个企业网站 有时有多达 3000 名用户同时观看视频流
  • PyTorch 教程错误训练分类器

    我刚刚开始 PyTorch 教程使用 PyTorch 进行深度学习 60 分钟闪电战我应该补充一点 我之前没有编写过任何 python 但其他语言 如 Java 现在 我的代码看起来像 import torch import torchvi
  • java 的地理图表

    谁能推荐一个 Java 组件 它可以让您创建一个漂亮的世界地图图像 突出显示某些国家 基于一些统计数据 与此图像类似的东西 类似于 Google 地理图表 但适用于 Java https developers google com char
  • Visual Studio Android ApkSigner 在密钥库中找不到密钥

    我在 Visual Studio 中创建 APK 时收到此错误 Failed to load signer signer 1 C googleplay keystore entry googleplay does not contain a
  • 使用pipenv,如何在pipfile中指定最低的python版本?

    Pipenv 有没有办法在 Pipfile 中指定 python 的最低版本 像这样的东西会起作用吗 requires python version gt python 3 5 No pipenv does not支持这一点 每Pipenv
  • xcode 接口生成器对象链接到检查器中的自定义类?

    在Xcode 最新版本 Interfacebuilder中 您可以将对象链接到代码 我创建了一个类 interface FileChangeController NSObject 但它没有在 Interface Builder Inspec
  • ios8 - 如何显示默认共享表

    我想展示并使用默认的 分享到其他服务 表 以便允许分享到 Twitter Facebook 电子邮件等 我不知道如何从我的应用程序中显示此视图 我该怎么做 您可以使用简单的活动控制器来显示默认共享应用程序 NSArray activityI
  • 使用 py2neo 在 neo4j 上查询写入性能

    目前 我正在努力寻找一种高性能的方法 使用 py2neo 运行多个查询 我的问题是 python 中有一大堆需要写入 neo4j 的写入查询 我现在尝试了多种方法来解决这个问题 对我来说最好的工作方法如下 from py2neo impor
  • 在 ninja/cmake 中操纵独立目标的构建顺序

    我正在开发一个使用 cmake ninja 构建的 C 项目 在 64 线程计算机上有大约 1200 个构建目标 有一个翻译单元需要 10 分钟来编译 大多数其他单元都相对较快 因此所有其他目标的构建一起只需要大约 9 分钟 在所有线程上构
  • 通过对具有匹配 id 编号的对象进行分组来重建 NSArray?

    我有一个 NSArray 数组中的每个对象都有一个 groupId 和一个名称 每个对象都是唯一的 但有许多对象具有相同的 groupId 有没有办法可以将数组分开并重建它 以便将名称分组到具有相应 groubId 的单个对象中 这是数组当
  • 获取密封特征的子类

    是否有可能 通过宏 某种形式的无形状自动魔法或其他形式 获得密封特征的子类列表 在编译时 在运行时 您不需要任何第三方库来执行此操作 sealed trait MyTrait case object SubClass1 extends My
  • 使用 C# 搜索 CSV 文件并提取旁边列中的值

    我正在尝试编写一个我正在编写的程序 Visual Studio 中的 C 在外部 CSV 文件中查找值 并将下一列中的值拉回到我的 WinForm 中的标签中 我的 CSV 文件是使用虚拟数据进行的测试 如下 gt old newuser
  • 如何获取 pexpect 日志文件中的时间戳

    我在用pexpect处理我的 telnet 和 ssh 通信 我还将所有请求 响应写入logfile using pexpect logfile filename 我想拥有时间戳也在日志文件中 我在文档中找不到它 有谁知道如何实现此功能 l
  • 这就是 C 中 + 运算符的实现方式吗?

    当理解原始运算符如 and 是用C实现的 我发现了以下片段一个有趣的答案 https stackoverflow com a 11694778 5399734 replaces the operator int add int x int
  • 从抓取的网页获取页面标题[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions var h
  • 在各种浏览器中用javascript读取客户端的文件内容

    我试图提供一个仅脚本的解决方案 用于通过浏览器读取客户端计算机上的文件内容 我有一个适用于 Firefox 和 Internet Explorer 的解决方案 这并不漂亮 但我现在只是在尝试 function getFileContents
  • 当 Window AllowsTransparency = true 时,WPF 是否硬件加速?

    我一直在考虑在 WPF 中制作自己的窗口框架 类似于 Visual Studio 我已阅读该设置AllowsTransparency true将强制 WPF 以软件模式呈现 这个例子 https wpfwindow codeplex com
  • LINQ 中的多个左联接

    我正在尝试将 SQL 查询转换为 LINQ 但无法正确获取语法 我原来的 工作的 SQL 查询是 SELECT a PersonnelNumber a LastName a FirstName a MiddleInitial b Title