如何强制 LINQ to SQL 对可为空的外键执行 INNER JOIN?

2024-06-23

我有一个非常简单的设置。表“Node”具有可为空的外键“ObjectId”。这在我的数据库模型中用一对多关联表示。现在,我想运行一个查询,为我提供具有特定对象 ID 的所有节点对象。在直接 SQL 中,这非常简单:

SELECT Node.*, Object.*
FROM Node INNER JOIN Object
    ON Node.ObjectId = Object.ObjectId
WHERE Node.ObjectId = @objectId

但现在我想在 LINQ to SQL 中做同样的事情:

private static Func<MyDataContext, string, IQueryable<DataNode>> _queryGet =
        CompiledQuery.Compile(
            (MyDataContext context, string objectId) =>
                (from node in context.DataNodes
                 where node.ObjectId == objectId
                 select node));

var loadOptions = new DataLoadOptions();
loadOptions.LoadWith<DataNode>(node => node.DataObject);
context.LoadOptions = loadOptions;

DataNode node = _queryGet.Invoke(context, objectId).FirstOrDefault();
...

令人沮丧的是 LINQalways为此查询生成一个 LEFT OUTER JOIN,我尝试过的任何操作都没有什么区别。

从表面上看,这似乎有道理。 ObjectId 外键可为空,因此某些节点不会有关联的对象。但在我的查询中,我提供了一个对象 ID。我对没有关联对象的节点不感兴趣。

在这种情况下,INNER JOIN 是正确的做法,但如何说服 LINQ?


我认为你只需要让它成为左外连接。我想象当表达式树转换为 SQL 时,连接和相等谓词被视为结果查询的单独部分。换句话说,左外连接之所以存在,是因为您正在连接一个可为空的外键,并且相等部分是在之后写入的(可以这么说)。

它没有按照您想要的方式翻译真的很重要吗?当您使用 LINQ to SQL 时,您并不总能获得最有效的查询,这是一种可接受的权衡。大多数时候,如果你没有做任何疯狂的事情,并且如果你really认为这会影响性能什么的,你可以随时编写一个LINQ to SQL可以使用的存储过程。

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

如何强制 LINQ to SQL 对可为空的外键执行 INNER JOIN? 的相关文章

  • 在 2 个 .c 文件之间共享函数

    dir1有dir2 file1 c和file1 h dir2 有 file2 c 现在 如果我想在 file2 c 中访问 file1 c 中定义的函数 我需要在 file1 h 中声明它并在 file2 c 中包含 file1 h 这是一
  • OWIN AuthenticationOptions 在 mvc5 应用程序中运行时更新

    Hi 情况如下 我在 iis 7 上有一个带有 Identity 2 的 MVC 5 应用程序 该应用程序为多个网站提供服务 主机名是某些网站的关键 网站 另一个网站 等等 我决定在我的所有网站上使用谷歌外部登录 每个网站都应该是带有个人
  • 带方括号的 Uri.EscapeUriString

    这是一个奇怪的问题 但让我们看看它会得到什么样的回应 如果我编写一个控制台应用程序 VS 2013 NET 4 5 1 并执行这行代码 Uri EscapeUriString 我明白了 但是 如果我执行同样的事情 嗯 从技术上来说Uri E
  • 在子目录中构建共享库

    我正在尝试构建一个使用一些 C 代码的 R 包 我有一个编译为可执行文件的 C 库 可以从命令行调用 有一个与之关联的 Makefile 我正在尝试获取信息here http cran r project org doc manuals R
  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 如何从 std::vector 中删除元素而不调整其大小

    迭代器擦除 迭代器位置 迭代器擦除 首先是迭代器 迭代器最后 擦除元素 从向量中删除 容器可以是单个元素 位置 或一系列元素 第一个 最后一个 这有效地减少了向量 大小除以元素数量 删除 调用每个元素的 之前的析构函数 and remove
  • C# Visual Studio 动态代码片段

    我正在开发一个 WinForms 项目 每天都会执行一些重复性的任务 所以我认为创建代码片段 https msdn microsoft com en us library ms165394 v vs 110 aspx会帮助我 但它仅适用于固
  • 错误 C2065:'cout':未声明的标识符

    我正在处理我的编程作业的 驱动程序 部分 但我不断收到这个荒谬的错误 错误 C2065 cout 未声明的标识符 我什至尝试过使用std cout但我收到另一个错误 IntelliSense 命名空间 std 没有成员 cout 当我宣布u
  • 将标准库添加到C++ eclipse项目中

    一个 非常 新手 C 问题 有没有办法自动将标准库添加到 C eclipse 项目中 我安装了 CDT 主要功能插件 您可以手动添加 STL 标头的路径路径和符号 gt 包含选项卡 http help eclipse org galileo
  • 用于 C/C++ 的独立跨平台 (Windows/Linux) 文件压缩?

    我正在寻找一个 最好是小的 C 或 C 开源库 我可以将其包含在我的 MIT 许可项目中 托管在 google 代码上 我是一名业余爱好 C C 程序员 所以我并不那么先进 但我只知道为名为 SA MP 的应用程序 适用于 Windows
  • Linux C++ 调试器

    我正在寻找完美的 Linux C 调试器 我不期望成功 但搜索应该提供丰富的信息 我是一个非常有能力的 gdb 用户 但 STL 和 Boost 很容易压垮我的调试技能 并不是说我无法深入了解数据结构的内部结构 而是它需要很长时间 我通常会
  • Excel 2007 中的数值 - 底层 xml 文件中的表示与存储

    这个问题与 NET和OpenXml有关 我已经阅读了以下文章 它有很好的解释 但没有回答我的问题 Excel 2007 中数值的可视化与底层 xml 文件不一致 https stackoverflow com questions 58594
  • 从条件表中获取 WHERE 子句的条件

    我创建了以下简单的DataModel 我用以下数据填充了表格 1 桌子Customer INSERT INTO test customer CustomerName Country RegistrationDate VALUES Custo
  • 如何在 Windows 8.1 上打开多个 Visual Studio 窗口? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我使用的是 Windows 7 我能够启动多个 Visual Studio 并同时工作 现在我有 Windows 8 1 操作系统 每当我
  • 合并大文件的最佳方法是什么?

    我必须合并数千个大文件 每个大约 200MB 我想知道合并这些文件的最佳方法是什么 行将有条件地复制到合并文件中 可以使用 File AppendAllLines 或使用 Stream CopyTo 吗 使用 File AppendAllL
  • 64 位随机生成器种子

    我目前正在运行一个具有 8 个以上管道 线程 的多线程模拟应用程序 这些管道运行非常复杂的代码 该代码取决于种子生成的随机序列 然后该序列被归结为单个 0 1 我希望在将种子从主线程传递到处理管道后 这种 随机处理 具有 100 的确定性
  • 预览MouseMove 与 MouseMove

    我有相当多的 XAML 经验 但最近我注意到我的大多数同事都使用预览鼠标移动代替鼠标移动事件 我一直用鼠标移动它对我很有帮助 但我忍不住问我什么时候应该使用预览鼠标移动什么时候鼠标移动 有什么区别 各自有什么优点和缺点等等 PreviewM
  • 从不同的线程访问对象

    我有一个服务器类 它基本上等待来自客户端的连接 在该类中 我创建了一个 NetworkStream 对象 以便能够从客户端接收字节 由于 NetworkStream Read 方法不是异步的 这意味着它将等到从客户端读取字节才能继续执行类似
  • Unity 错误“内部构建系统错误。后端退出,代码为 -1073740791。”摧毁/杀死了我的项目

    好吧 我可能在这里夸大了 但这是真的 当我开始打开它时 该项目由于错误 内部构建系统错误 后端退出 代码为 1073740791 而被破坏 应用程序 这个项目已经在Google Play上发布了 也许和设置有关 有人可以帮忙吗 完整错误 I
  • Json.net 将数字属性序列化为字符串

    我正在使用 JsonConvert SerializeObject 序列化模型对象 服务器期望所有字段都是字符串 我的模型对象具有数字属性和字符串属性 我无法向模型对象添加属性 有没有办法将所有属性值序列化为字符串 我必须只支持序列化 而不

随机推荐

  • 在 Perl 中 JSON 编码/解码 utf8 字符串

    我通过一个utf8 http perldoc perl org utf8 html从我的命令行将字符串编码到 Perl 程序中 gt test pl string et s try hi gs 这似乎正确识别了字符串 use utf8 Ge
  • 使用 Newtonsoft.Json 反序列化 DbGeometry

    我正在使用 Angular Breeze 和 Web API 2 构建 SPA 遵循 John Papa 在他最新的 PluralSight 课程中概述的方法 一切运行良好 我可以将信息拉取 更新 插入 删除回服务器 但是 我正在使用空间类
  • MVC3:一个控制器是否需要 Windows 身份验证,而第二个控制器允许匿名?

    我有一个控制器 用于在需要 Windows 身份验证的内部 Web 应用程序中呈现页面 是否存在第二个控制器 用于对系统进行基于 JSON 的查询 不需要进行 Windows 身份验证 那可能吗 看来我目前只能做其中之一 有什么建议么 我们
  • 将 jquery Ui.ressized() 与 AngularJs 一起使用

    我的模板之一中有一个 DOM 元素 我想使用 jqueryUi 调整其大小 总而言之 我有一个 div 我的模板中名为 test 的元素 除此之外 我还尝试添加脚本来实际在多个位置调整大小 但我已经完全扭转了局面 我一度认为指令可能是正确的
  • 要求用户输入变量后无法解析为变量

    这可能是显而易见的事情 但是当我试图强制用户继续输入一个值直到他输入有效值时 我收到一个错误 指出该变量无法解析 然后 如果我事先声明它 我会收到一条错误消息 指出重复值 do float x Float parseFloat javax
  • 计算 R 中多峰分布的众数

    我已经测量了我所有孩子的身高 当我沿着长度轴绘制所有高度时 结果如下所示 每一个红色 男孩 或紫色 女孩 蜱虫都是一个孩子 如果两个孩子的身高相同 以毫米为单位 蜱虫就会堆积起来 目前有七个身高相同的孩子 刻度线的高度和宽度没有意义 它们已
  • 按钮单击无法正常工作

    我不知道我做错了什么 这是一个 2D 项目 有两个对象 一个有一个RigidBody2D and BoxCollider2D成分 第二个对象只有BoxCollider2D 底部有一个按钮 按下按钮时Object1跌倒在Object2 and
  • Woocommerce 中的订单接收页面上的 JS 跟踪代码中的订单商品

    我正在尝试在 Woocommerce 谢谢页面中集成跟踪代码 我只找到了订单id来填写 但我不知道如何完成订单项目数据 这是我的实际代码
  • SQL Server 将 XML 子节点附加到父节点

    我需要一个脚本 可以将新的 xml 子节点插入 附加到预先存在的 xml 父节点 New child nodes DECLARE XMLChildData XML SET XMLChildData
  • 由容器管理的多个EntityManager(CMT)

    我遇到以下情况 我的应用程序需要动态连接到多个数据库 因此经过大量搜索后 我认为最好的选择是创建多个 EntityManager 并在运行时决定使用哪一个 这是代码 public class GenericDao PersistenceCo
  • ES6 箭头函数和函数内的词法作用域[重复]

    这个问题在这里已经有答案了 let a gt name Anna func gt console log this name let b gt name Brian func function console log this name l
  • UNIX/Linux IPC:从管道读取。运行时如何知道数据长度?

    我有一个子进程 它生成一些可变长度的输出 然后使用半双工管道将其发送到父进程 在父级中 如何使用 read 函数 由于每次数据的长度可能不同 我如何在运行时知道数据的大小以对缓冲区执行任何 malloc 操作 fstat 函数可以用于管道文
  • IE8 不透明度 activex 问题

    在我的 css 文件中我有这个 imageDes opacity 70 filter alpha opacity 70 如果我在 html 页面上使用它并在 IE8 中打开它 我会收到一个 activex 警告 我能做些什么 这是在本地安全
  • 在 IIS 服务下使用 COM 在 C# 中将 PowerPoint 渲染为 png 时出现问题

    首先 我的程序可以将 pptx 渲染为 png 但在 Windows Server 2008 R2 上渲染时质量大大降低 我想知道为什么 我使用 Cassini 在 Windows 7 x64 上测试了我的程序 并且将 pptx 渲染为 p
  • 关于ggplot2:旋转geom_point形状并在线上方显示geom_text

    早上好 我正在尝试使用 ggplot2 包进行绘图 但面临以下问题 为了使它更容易理解 这是我想要制作的目标图像 就像图像一样 我想要执行以下操作 1 在虚线上方放置一个文本 中位数 以便可以清楚地看到该字符 2 旋转三角形的度数 不是 而
  • MSTest 中数据驱动测试的问题

    我正在尝试使用 MSTest Selenium 在 C 中进行数据驱动测试 这是我尝试设置它的一些代码的示例 TestClass public class NewTest private ISelenium selenium private
  • 查找列表中元素的索引

    我需要获取方案列表中元素的索引 例如 2 2 3 4 5 4 2 3 4 5 2 有人可以帮忙吗 像这样的东西 define list index lambda e lst if null lst 1 if eq car lst e 0 i
  • 如何在 AS3 flash 中暂停/播放嵌入声音

    我有一个长度为 1 分 30 分钟的声音 我将其嵌入到我的 swf 中并将其设置为与框架同步 我需要的是能够通过 ActionScript 暂停和播放这个声音 有谁知道如何做到这一点 number that is redefined whe
  • 为什么 Single() 找到多个元素时不直接返回? [复制]

    这个问题在这里已经有答案了 我在 大致 找到了这段代码Enumerable Single http msdn microsoft com en us library system linq enumerable single aspx方法
  • 如何强制 LINQ to SQL 对可为空的外键执行 INNER JOIN?

    我有一个非常简单的设置 表 Node 具有可为空的外键 ObjectId 这在我的数据库模型中用一对多关联表示 现在 我想运行一个查询 为我提供具有特定对象 ID 的所有节点对象 在直接 SQL 中 这非常简单 SELECT Node Ob