EF Core - 从两个相同的表中提取数据
EF Core - Pulling Data From Two Identical Tables
TLDR:我有两个具有相同定义的 table,我需要根据某个开关从一个 table 或 中提取另一个.
例如,假设 table 有一堆 "generic" FooItem
和 table 有 "Fancy" FooItem
...两个 table 之间的唯一区别是名称 SIMPLE_FOO
和 FANCY_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 /*)
TLDR:我有两个具有相同定义的 table,我需要根据某个开关从一个 table 或 中提取另一个.
例如,假设 table 有一堆 "generic" FooItem
和 table 有 "Fancy" FooItem
...两个 table 之间的唯一区别是名称 SIMPLE_FOO
和 FANCY_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 /*)