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中文网其他相关文章!