如何在Entity Framework中使用动态DbSet?

时间:2016-08-15 10:11:53

标签: c# entity-framework

请告诉我如何根据字符串变量选择DbSet?我所拥有的是以下内容:

public class DataContext : DbContext
{
    public DataContext() : base("myDb") { }

    public DbSet<Entry> RurEntries { get; set; }
    public DbSet<Entry> UsdEntries { get; set; }
    public DbSet<Entry> EurEntries { get; set; }
}

每种货币有3个表格:Rur,Usd,Eur。都具有相同的结构。 有一个名为CurrentCurrency的字符串变量,它从UI更改,可能是3种货币之一。在我之前没有实体框架的代码中,我有一些代码用纯sql读取db,有些像:

string sqlQuery = "Select * from " + CurrentCurrency 

现在我决定用Entity Framework重写代码并面对这个问题。任何答案将不胜感激。提前谢谢。

3 个答案:

答案 0 :(得分:3)

您只需打开CurrentCurrency字符串即可获得所需的设置:

arr[3]

答案 1 :(得分:1)

每个DbContext只能在T中使用一个实体类DbSet<T>。你的代码不会运行。另请参阅Entity Framework 6 Creating Two table from the same entity object

鉴于你的意见:

  

所有3个表都有unique_id字段,我从另一个软件收到。我在该列上使用了唯一标志,如果我将所有条目放在同一个表中,则可能会出现问题

您只需要一个由Currency和ExternalId组成的复合主键,如Composite Key with EF 4.1 Code First中所述:

public class Entry
{
    [Key]
    [Column(Order = 0)]
    public string Currency { get; set; }

    [Key]
    [Column(Order = 1)]
    public string ExternalId { get; set; }
}

然后你可以阅读&#34; EUR&#34;像这样的行:

var eurRows = dbContext.Entries.Where(e => e.Currency == "EUR");

答案 2 :(得分:0)

您可以在Entity Framework中执行原始SQL查询。像这样:

var curs = context.Database.SqlQuery<Entry>("Select * from " + CurrentCurrency").ToList();

您还可以使它更整洁并创建存储过程,您可以在其中发送参数并根据该参数执行SELECT语句。然后使用Entity框架,您将该过程调用为将结果映射到List<Entry>

但是,正如我在评论中所说的,我个人更喜欢只有一个表CurrenyCode列。而不是具有完全相同的结构但具有不同数据的3个表。然后你可以像这样查询:

var curs = var curs = context.Currencies.Where(x=> x.CurrencyCode = CurrentCurrency)
                                        .ToList();