使用Entity Framework Core我尝试映射包含子集合的实体。 没有projectTo生成的SQL包含where子句,只提取属于子集合的实体。当我添加一个projectTo时,结果是正确但是查看SQL我看不到where子句。它似乎加载子类型的所有实体,然后在内存中执行。 我已经在集合上尝试了各种映射,但似乎没有任何改变这种行为。 有没有办法改进这个查询?
有问题的代码是:
var parent = _context
.Parents
.Where(a => a.FamilyId == familyId && a.Id == id)
.Include(r => r.Children)
//.ProjectTo<ParentDetailViewModel>()
.AsNoTracking() // In case projection contains sub entities
.SingleOrDefault();
没有项目,我在分析器中看到以下SQL
exec sp_executesql N'SELECT [r].[Id], [r].[FieldOne], [r].[Cid], [r].[FieldTwo], [r].[ParentId]
FROM [Child] AS [r]
WHERE EXISTS (
SELECT TOP(2) 1
FROM [Parent] AS [a]
WHERE (([a].[FamilyId] = @__familyId_0) AND ([a].[Id] = @__id_1)) AND ([r].[ParentId] = [a].[Id]))
ORDER BY [r].[ParentId]',N'@__familyId_0 int,@__id_1 int',@__familyId_0=1,@__id_1=1
通过项目,我看到了这一点。没有包含where子句。
SELECT [r].[ParentId], [r].[Id]
FROM [Child] AS [r]
答案 0 :(得分:2)
作为一般的经验法则,我将ProjectTo作为查询实现之前的最后一件事。在AsNoTracking之后放置ProjectTo - 但是,AsNoTracking毫无意义。使用ProjectTo,您可以完全跳过实体,直接从SQL到DTO,根本不涉及任何实体。
此外,Include毫无意义。使用ProjectTo / Select,EF确切地知道它需要加入哪些实体,因为它们在Select投影中!
答案 1 :(得分:0)
显然是由Entity Framework Core错误引起的。已在1.1.0预览中修复