2016-08-15 75 views
2

coluld請你好好告訴我如何根據字符串變量選擇DbSet?我有以下幾種:如何在實體框架中使用動態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 

現在我決定與實體框架重寫代碼,面臨這個問題。任何答案將不勝感激。提前致謝。

+3

你爲什麼不只是介紹一個標誌表中,而不是創建三個表? – user3185569

+0

你已經嘗試和失敗了什麼? –

+0

所有3個表都有unique_id字段,我從另一個軟件收到。我在該列上使用了唯一標誌,如果我將所有條目都放到同一個表中,可能會出現問題 – Smilley

回答

1

只能在一次每次的DbContext一個DbSet<T>使用實體類T 。你的代碼不會運行。另見Entity Framework 6 Creating Two table from the same entity object

鑑於您的評論:

所有3個表具有UNIQUE_ID場,這是我從另一個軟件接收。我用的是列中的唯一標誌,如果我把所有的條目到同一個表它可能是一個問題

你只需要一個複合主鍵,包括貨幣和外部ID,如在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; } 
} 

然後,你可以這樣寫的「歐元」行:

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

謝謝。這工作正常。 – Smilley

0

您可以在實體框架中執行原始SQL查詢。就像這樣:

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

您也可以讓更多的整潔,創建一個存儲過程,您發送的參數,並執行基於該參數的SELECT聲明。然後使用實體框架,您可以調用該過程將結果映射到List<Entry>

但是,正如我在評論中指出的那樣,我個人更喜歡只有一個帶有CurrenyCode列的表格。而不是具有完全相同結構但具有不同數據的3個表格。然後你就可以查詢這樣的:

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

您可以在CurrentCurrency串簡單地切換才能完成設置,您需要:

var db = new DataContext(); 
     var CurrentCurrency = "RUR"; 
     DbSet<Entry> set = null; 
     switch (CurrentCurrency) { 
      case "RUR": 
       set = db.RurEntries; 
      break; 
      case "EUR": 
       set = db.EurEntries; 
      break; 
      case "USD": 
       set = db.UsdEntries; 
      break; 
      default: 
       throw new Exception(); 
     } 
     var res = set.ToList(); 
+0

正是我所需要的。謝謝。 – Smilley

+0

由於@CodeCaster寫道不起作用,因爲我只能在DbSet 中針對每個DbContext使用一個實體類T.最後不得不將字段貨幣介紹給我的班級。 – Smilley

+0

@Smilley我認爲這應該工作,如果你使用繼承和條目將只是一個抽象的基類。無論如何,CodeCaster建議的解決方案似乎更直接。 – 3615