【发布时间】:2019-11-08 21:13:16
【问题描述】:
我有一个看起来像这样的查询(实体框架核心 2.2.7):
var query = from row in _entities.MyEntities
.Include(e => e.MyEntityChildren)
.Include(e => e.MyParent)
.Include(e => e.MyParent2)
.Include(e => e.MyParent3)
.Include(e => e.MyParent4)
where row.MyParent4.Id == "whatever" &&
dict.Contains(row.Id) &&
active.Contains(row.Status)
select row;
然后根据我执行查询的方式得到不同的结果:
var e = await query.FirstOrDefaultAsync();
工作正常
var e = await query.Distinct().ToListAsync();
不填充 MyParent3。但是这两个查询都包含所有其他关系。
所以我的问题是。这是一个已知的问题? first 和 list 和有什么不一样?有没有人知道如何解决它?
生成的 sql 看起来相同,并且 MyParent3 在这两种情况下都是从数据库中获取的,所以我怀疑它与序列化程序有关。这适用于实体框架核心 2.0.9
编辑:忘记区分了!
【问题讨论】:
-
你添加了 "distinct" :你的意思是 ToListAsync 单独工作,但如果你使用 Distinct 就不行?
-
哦,我可以看到“ToList”的一个潜在问题:它获取所有数据,因此可能其中一个数据导致包含失败。请同时提供 MyParent3 的 SQL 表的实际架构,以及您的数据库是什么(SqlServer?MySql?)。
-
当然还有相关类的定义(
MyEntity和MyParent3) -
谢谢@Pac0,这可以解释。我在调试时遇到了一些麻烦,因为我有一个可以工作的第一个,但是当我得到列表时,甚至第一个也失败了。 (我假设是因为它是一个参考。让我调查一下。
-
FirstOrDefaultAsync和Distinct()完全不同,并且不能生成相同的查询 - 除非 EF Core 使用客户端评估来提取 all i> 将数据发送到客户端并尝试在那里过滤它们。FirstOrDefaultAsync是一个SELECT TOP 1,它返回第一个匹配的行,不管它包含什么。Distinct()生成一个SELECT DISTINCT,而不是返回 multiple 行
标签: c# entity-framework entity-framework-core