EF Core多JOIN条件触发CS1941错误的正确LINQ写法咨询
要转换的原SQL参考《T-SQL Fundamentals Third Edition》第三章对应双条件左外连接语句如下:
SELECT c.custid, c.companyname, o.orderid, o.orderdate FROM Sales.Customers AS c LEFT OUTER JOIN Sales.Orders AS o ON c.custid = o.custid AND o.orderdate >= '2016-01-01';
错误原因说明
- 触发CS1941编译错误的核心原因是LINQ的
Join/GroupJoin语法仅支持左右序列的键对等比较,无法直接在on子句中拼接额外条件,触发类型不匹配。 - 把额外条件写在
Where子句会过滤掉左连接无匹配的右表空值行,导致结果数量远少于预期。
正确LINQ实现(查询语法)
var result = from customer in dbContext.Customers // 提前过滤右表的非键条件,再执行左连接 join order in dbContext.Orders.Where(o => o.OrderDate >= new DateTime(2016, 1, 1)) on customer.Custid equals order.Custid into orderGroup from order in orderGroup.DefaultIfEmpty() select new { customer.Custid, customer.CompanyName, order.OrderId, order.OrderDate };
正确LINQ实现(方法语法)
var result = dbContext.Customers .GroupJoin( dbContext.Orders.Where(o => o.OrderDate >= new DateTime(2016, 1, 1)), c => c.Custid, o => o.Custid, (c, orders) => new { Customer = c, Orders = orders } ) .SelectMany( x => x.Orders.DefaultIfEmpty(), (x, order) => new { x.Customer.Custid, x.Customer.CompanyName, order.OrderId, order.OrderDate } );
上述两种写法生成的SQL与原T-SQL语义完全一致,会保留所有左表(客户)记录,无匹配订单的对应字段返回null,最终返回结果行数与SSMS执行原SQL的91行一致。
内容的提问来源于stack exchange,提问作者dharmatech
相关产品推荐
相关产品推荐

