c# - 如何在 .NET Core 3.0 Entity Framework 中执行组加入?

标签 c# entity-framework linq .net-core .net-core-3.0

随着 .NET Core 3.0 的变化,我得到了

... NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.) ---> System.InvalidOperationException: Processing of the LINQ expression 'GroupJoin, ...

这是一个非常简单的查询,因此必须有一种方法可以在 .NET CORE 3.0 中执行它:

 var queryResults1 = await patients
            .GroupJoin(
                _context.Studies,
                p => p.Id,
                s => s.Patient.Id,
                (p, studies) => new 
                {
                    p.DateOfBirth,
                    p.Id,
                    p.Name,
                    p.Sex,
                   Studies =studies.Select(s1=>s1)
                }
            )
            .AsNoTracking().ToListAsync();

我基本上是在寻找一个 Linq 查询(或上面的方法语法),它将 Studies 加入到 Patients 中,并将 Studies 设置为空列表,如果没有针对给定患者的研究,则设置为 null。

有什么想法吗?这在 .NET Core 2.2 中有效。上面的 MSFT 链接还提到关键的重大变化与客户端评估有关,并避免生成的查询读取整个表,然后必须连接或过滤客户端。然而,通过这个简单的查询,连接应该很容易在服务器端实现。

最佳答案

讨论 here ,您正在尝试数据库不支持的查询。 EF Core 2 使用客户端评估来让您的代码工作,但 EF Core 3 拒绝了,因为随着数据集的增加,客户端的便利性是以难以调试的性能问题为代价的。

您可以使用 DefaultIfEmpty 左键加入患者的研究,然后使用 ToLookup 手动分组。

var query =
    from p in db.Patients
    join s in db.Studies on p.Id equals s.PatientId into studies
    from s in studies.DefaultIfEmpty()
    select new { Patient = p, Study = s };

var grouping = query.ToLookup(e => e.Patient); // Grouping done client side

解决N+1 problem ,上面的示例抓取了完整的 Patient 和 Study 实体,但您可以改用 cherry pick 列。如果您需要的患者数据太大而无法为每个研究重复,则在联合查询中仅选择患者 ID,在单独的非联合查询中查询其余患者数据。

关于c# - 如何在 .NET Core 3.0 Entity Framework 中执行组加入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58622571/

相关文章:

mysql - EF Code First Migrations - 两个程序集 - 查看错误的配置文件

linq - 如何在 LINQ 中按多个字段排序?

c# - Linq 分组依据和排序依据

c# - 将任意字符串数字解析为数字

c# - 为 gRPC 客户端创建接口(interface)以进行单元测试

c# - Entity Framework 6 - 该类型已配置为实体类型。它不能重新配置为复杂类型

entity-framework - 如何从 EF5 Code First 中的分隔 ID 列表返回实体

linq - 使用 Entity Framework 连接查询

c# - .net core 2.0 在 ubuntu 上运行控制台应用程序时出错

c# - Swift:这个 nil 是如何进入我的 [String: AnyObject] 字典的,我该如何摆脱它?