EF Core - 从两个相同的表中提取数据

EF Core - Pulling Data From Two Identical Tables

TLDR:我有两个具有相同定义的 table,我需要根据某个开关从一个 table 中提取另一个.

例如,假设 table 有一堆 "generic" FooItem 和 table 有 "Fancy" FooItem...两个 table 之间的唯一区别是名称 SIMPLE_FOOFANCY_FOO

取决于布尔值,例如 GetFancy == true,我应该从 FANCY_FOO 读取,否则,SIMPLE_FOO

这在 DbContext 中变得复杂。在我的上下文中,我不能有多个 DbSet<FooItem>,而且我不能在 ModelBuilder.Entity<FooItem>(e => e.ToView("pickOne")) 中动态地 "inject" table 名称 ... 而且我不会想要复制整个 dbContext 只是为了在其中具有不同的 table 名称。

我确定解决方案很简单,但我只是没有看到。感谢任何帮助。

编辑: 我无法更改数据库。这是一种愚蠢的做法,但他们就是这样做的,我不得不接受它。

在您的解决方案中只需要两个实体,每个实体一个 table。它们可以从基础 class 继承,因为它们是相同的。创建包含两个 table 中所有字段的基础 class "BaseFooItem"。然后为每个变体(简单和花式)创建一个实体 class 并注释每个以匹配必要的 table 名称;例如:

[Table("SIMPLE_FOO")]
public class SimpleFooItem: BaseFooItem {
}

如果您不想使用数据注释,您也可以使用 FluentAPI 设置 table 名称。然后为每个实体创建一个DbSet:

    public DbSet<SimpleFooItem> SimpleFooItems { get; set; }
    public DbSet<FancyFooItem> FancyFooItems { get; set; }

然后根据条件在每个 DbSet 之间切换,例如:

if (GetFancy) {
   return dbContext.FancyFooItems.SingleOrDefault(a => a.Id == id);
} else {
   return dbContext.SimpleFooItems.SingleOrDefault(a => a.Id == id);
}

希望我正确理解了您的需求。

在我看来,最简单的做法是利用 .FromSql() 方法并使用它来选择 table:

var foos = GetFancy
  ? dbContext.FromSql(select * from FANCY_FOO)
  : dbContext.FromSql(select * from SIMPLE_FOO)

return foos.Where(/* etc /*)