如何在 EF Core 中将内部联接与计算列一起使用?

Posted

技术标签:

【中文标题】如何在 EF Core 中将内部联接与计算列一起使用?【英文标题】:How use Inner Join with a computed column in EF Core? 【发布时间】:2022-01-13 18:55:19 【问题描述】:

我最近在 EF Core 中发现了计算列值:

modelBuilder.Entity<Person>()
.Property(p => p.DisplayName)
.HasComputedColumnSql("[LastName] + ', ' + [FirstName]");

您将如何使用相同的方法对另一个表进行内部连接?

【问题讨论】:

我根本不会使用联接。 EF Core 的工作是根据实体之间的关系生成 JOIN。如果您必须在查询中使用 JOIN,则模型缺少关系 我正在使用继承功能。然后我在虚拟属性上使用覆盖。就我而言,这些是我想存储在同一个表中并使用鉴别器区分的不同类型的预定事件。与将 DbContext 注入实际类相比,连接应该是性能更好的选项。 这并不意味着您必须明确加入查询。如果您指定关系,EF Core 将在需要时创建连接。如果你加入计算列,或者基于它们指定关系,你会得到最差的性能,除非你使用持久化的索引计算列。 所以说我有 Project.Customer。如何将客户名称作为计算属性获取? 请说明您需要它的目的是什么。看起来你做错了什么。 【参考方案1】:

我现在不知道更好的解决方案,但是将计算列添加到数据库是最糟糕的主意。

我们可以在这里做的只是定义通用方法来丰富ScheduleEventDisplayName 或其他需要的属性:

public class SchedulerEventWithDisplayName

    public ScheduleEvent Event  get; set; 
    public string DisplayName  get; set; 

浓缩剂样品:

public static IQueryable<SchedulerEventWithDisplayName> EnrichWithDisplayName(IQueryable<ScheduleEvent> source)

    return source.Select(e => new SchedulerEventWithDisplayName
    
        Event = e,
        DisplayName = e is ScheduleEvent1 ? ((ScheduleEvent1)e).Field1 + ((ScheduleEvent1)e).Field2 : 
                      e is ScheduleEvent2 ? ((ScheduleEvent2)e).NavigationProp.Value :
                      "Some Default Value";
    );

如果它对你有用,你可以考虑如何动态创建这样的浓缩器。

【讨论】:

以上是关于如何在 EF Core 中将内部联接与计算列一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pandas 中将日期列和相关列一起取消嵌套?

如何将两个 DataTable 与内部连接连接在一起

LINQ EF Core 左连接 [重复]

更改生成的联接表的名称(多对多)-EF Core 5

如何首先在 EF 代码中创建持久计算列?

如何首先将 EF Core 代码与 azure synapse 一起使用