【问题标题】:Entity framework core does not include when ToListAsync, but does with FirstOrDefaultAsync实体框架核心不包括 ToListAsync 时,但使用 FirstOrDefaultAsync 时
【发布时间】: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?)。
  • 当然还有相关类的定义(MyEntityMyParent3
  • 谢谢@Pac0,这可以解释。我在调试时遇到了一些麻烦,因为我有一个可以工作的第一个,但是当我得到列表时,甚至第一个也失败了。 (我假设是因为它是一个参考。让我调查一下。
  • FirstOrDefaultAsyncDistinct() 完全不同,并且不能生成相同的查询 - 除非 EF Core 使用客户端评估来提取 all i> 将数据发送到客户端并尝试在那里过滤它们。 FirstOrDefaultAsync 是一个 SELECT TOP 1 ,它返回第一个匹配的行,不管它包含什么。 Distinct() 生成一个 SELECT DISTINCT,而不是返回 multiple

标签: c# entity-framework entity-framework-core


【解决方案1】:

假设您的查询中的数据为 (2, 3, 4, 1) 的第一个和列表之间的区别:
- Lists 类似于一个数组,其中包含超过 1 个元素会得到 ([2, 3, 4, 1])
- First 只包含1个元素,也就是第一个元素(2)

至于为什么它不起作用,我最好的猜测是:
1.你查询得到的数据格式不能序列化成列表,所以没有输出。
2.您的第一个示例也没有实际数据,它将返回一个默认项

【讨论】:

    【解决方案2】:

    我不知道它为什么会发生,也不想发布整个项目,因为 MyEntity 是例如Orders 和 MyParent3 是 ShippingInformation

    但是,如果我像这样循环结果,它会起作用:

    var result = new List<MyDomainEntity>();
    foreach (var dto in query.Distinct())
    {
        result.Add(GetEntity(dto));
    }
    

    如果其他人遇到这种情况,我会留下结果。

    编辑:我发生了命名冲突。

    【讨论】:

    • GetEntity 是做什么的?
    • 我与解决方案无关,但我只是从 EF 中获取数据作为 dto,然后我的 getEntity 将其转换为我的域模型。但我发现 getlist 总是正确加载,但 getlistasync 没有。 (哦,我不应该把它命名为 List 它应该是 List 什么的)
    • 这不是解决办法。这与原始代码基本相同。 ToList() 遍历输入并将元素添加到它返回的列表中
    • @PanagiotisKanavos 但它有效。当我使用 ToListAsync 时 MyParent3 为空,当我使用 ToList 时 MyParent3 被填写。
    • 没有实体及其关系就不可能解决 EF Core 问题。不涉及序列化程序,EF Core(和所有 ORM)使用 ADO 读取器读取结果,生成类并填充它们
    猜你喜欢
    • 2020-05-24
    • 2017-11-15
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多