首页 > 数据库 > mysql教程 > 如何在 LINQ to SQL 中执行具有多个条件的左外连接?

如何在 LINQ to SQL 中执行具有多个条件的左外连接?

Patricia Arquette
发布: 2025-01-12 09:58:41
原创
456 人浏览过

How to Perform a Left Outer Join with Multiple Conditions in LINQ to SQL?

LINQ to SQL:掌握具有多个条件的左外连接

将 SQL 查询转换为 LINQ to SQL 可能很棘手,尤其是对于复杂的联接。本文重点讨论一个常见场景:执行具有多个条件的左外连接。

SQL 挑战:

我们的起点是在“period”表和“facts”表之间使用左外连接的 SQL 查询。 连接使用两个条件:“p.id = f.periodid”和“f.otherid = 17”。第二个条件充当过滤器。

LINQ 障碍:

LINQ 的 DefaultIfEmpty() 方法是左外连接的常用方法。然而,简单地将 'f.otherid = 17' 添加到 where 子句 after 连接无法按预期工作。

有效的 LINQ 解决方案:

关键是使用之前应用第二个连接条件DefaultIfEmpty()。 这里有两个有效的方法:

方法一:使用扩展方法语法:

<code class="language-csharp">from p in context.Periods
join f in context.Facts on p.id equals f.periodid into fg
from fgi in fg.Where(f => f.otherid == 17).DefaultIfEmpty()
where p.companyid == 100
select fgi.value</code>
登录后复制

方法 2:使用子查询:

<code class="language-csharp">from p in context.Periods
join f in context.Facts on p.id equals f.periodid into fg
from fgi in (from f in fg
             where f.otherid == 17
             select f).DefaultIfEmpty()
where p.companyid == 100
select fgi.value</code>
登录后复制

为什么有效:

关键的区别在于条件的位置。 将 'f.otherid == 17' 放在 where 子句 after DefaultIfEmpty() 中将过滤掉 'f' 为 null 的行(因为连接未找到匹配项)。 通过将其放在 Where() 子句 before DefaultIfEmpty() 中,我们在引入 null 值之前过滤 before,确保正确的左外连接行为。 请注意,我们选择 fgi.value 而不是 f.value 来正确处理第一个方法中的空值。

以上是如何在 LINQ to SQL 中执行具有多个条件的左外连接?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板