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

时间:2020-02-14 22:49:49

标签: c# asp.net-core entity-framework-core dbcontext ef-core-2.2

TLDR:我有两个具有相同定义的表,我需要根据某个开关从一个表中拉出。

例如,假设一个表包含一堆“泛型” FooItem和一个表包含“ Fancy” FooItem ...,并且两个表之间的唯一区别是名称{{ 1}}和SIMPLE_FOO

根据布尔值(例如FANCY_FOO),我应该从GetFancy == true中读取,否则,请从FANCY_FOO中读取。

这在SIMPLE_FOO中变得很复杂。我的上下文中不能有多个DbContext,并且不能动态地将DbSet<FooItem>中的表名“注入” ...并且我不想复制整个dbContext只是在那里有一个不同的表名。

我确定解决方案很简单,但我只是没有看到它。感谢您的协助。

编辑:我无法更改数据库。这是一种愚蠢的方式,但是那是他们做到的方式,我必须忍受它。

2 个答案:

答案 0 :(得分:0)

解决方案中只有两个实体,每个表一个。它们可以从基类继承,因为它们是相同的。创建具有两个表中所有字段的基类“ BaseFooItem”。然后为每个变量(Simple和Fancy)创建一个实体类,并注释每个变量以匹配必要的表名;例如:

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

如果您不想使用数据注释,也可以使用FluentAPI设置表名称。然后为每个实体创建一个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);
}

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

答案 1 :(得分:0)

在我看来,最简单的方法是利用.FromSql()方法并使用该方法来选择哪个表:

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

return foos.Where(/* etc /*)