在访问数据涉及使用指定条件联接多个表的情况下,LINQ to SQL 提供了一种有效的手段执行此类操作。本文深入研究了需要具有多个联接条件的左外联接来检索数据的特定场景。
初始查询和挑战
考虑以下 SQL 查询:
SELECT f.value FROM period AS p LEFT OUTER JOIN facts AS f ON p.id = f.periodid AND f.otherid = 17 WHERE p.companyid = 100
任务是将此查询转换为 LINQ 表达式。虽然在 LINQ 中有执行左外连接的标准方法(例如,使用 DefaultIfEmpty()),但合并附加连接条件 f.otherid = 17 提出了挑战。
解决方案:放置连接条件在 DefaultIfEmpty()
解决此挑战的关键是在调用之前引入连接条件DefaultIfEmpty()。这可以使用扩展方法语法或子查询来实现:
// Using extension method syntax 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 f.value; // Using a subquery 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 f.value;
连接条件放置的说明
AND f.otherid = 17 条件是连接,因为它确保只有事实表中满足此条件的行才会与周期表中的相应行连接。将此条件放在连接后的 WHERE 子句中,将从周期表中排除在事实表中没有匹配行的任何行,即使这些行本来可以满足条件。通过在连接中指定条件,我们保留了所需的行为。
以上是如何在 LINQ to SQL 中实现具有多个条件的左外连接?的详细内容。更多信息请关注PHP中文网其他相关文章!