【发布时间】:2011-10-19 06:55:30
【问题描述】:
如何在 Linq to Entities 中编写此查询:
SELECT * FROM TableA a LEFT JOIN TableB b ON a.Id = b.TableAId WHERE ISNULL(b.Id) OR b.FieldA = 1
关系是一对多,但是限制b.FIeldA = 1是保证返回的实际数据是1-0...1,也就是说返回的记录数应该等于TableA中的记录数.我需要从 TableA 中获取所有数据,并从存在的 TableB 中加入数据。我正在尝试使用这个查询,它实际上像 INNER JOIN 一样执行(不检索 TableA 中没有相关记录的 TableB 记录)
Vladislav 建议了下面的查询列表,我在第一个查询中添加了额外的过滤:
var query = (from x in myParentClasses.Include(x => x.TableBChildren)
where !x.TableBChildren.Any(y => y.FieldA == 1)
select x)
.Concat(
from x in myParentClasses.Include(x => x.TableBChildren)
where x.TableBChildren.Any(y => y.FieldA == 1 || y.Id == null)
select x)
.ToList();
生成的 sql 如下所示:
SELECT [Project1][...]
FROM (SELECT [Extent1].[...],
[Extent2].[...],
[Extent3].[...],
CASE
WHEN ([Extent3].[Id] IS NULL) THEN CAST(NULL AS int)
ELSE 1
END AS [C1]
FROM [dbo].[ParentTable] AS [Extent1]
LEFT OUTER JOIN [dbo].[ReferenceTable] AS [Extent2]
ON [Extent1].[ReferenceId] = [Extent2].[Id]
LEFT OUTER JOIN [dbo].[ChildrenTable] AS [Extent3]
ON [Extent1].[Id] = [Extent3].[ParentId]
WHERE [Extent1].[FieldA] = 1 /* @p__linq__0 */) AS [Project1]
ORDER BY [Project1].[Id] ASC,
[Project1].[Id1] ASC,
[Project1].[C1] ASC
谢谢, 戈兰
【问题讨论】:
标签: linq-to-entities entity-framework-4.1