2016-08-15 12 views
2

あなたはとても親切で、文字列変数に応じてDbSetを選択する方法を教えてください。私が持っているものは以下の通りです: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。すべて同じ構造をしています。 UIから変更されたCurrentCurrencyという名前の文字列変数があり、3つの通貨のうちの1つである可能性があります。 Entity Frameworkのなしの私の以前のコードでは、私は純粋なSQLでDBを読んで、コードを持っていた、などのいろいろ書い:

string sqlQuery = "Select * from " + CurrentCurrency 

は、今私は、Entity Frameworkでコードを書き換えることを決定し、その問題に直面しました。どんな答えも高く評価されます。前もって感謝します。

+3

なぜあなただ​​けの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フィールドを持って、私は別のソフトウェアから受け取ります。私はその列にユニークなフラグを使用して、私は同じテーブルにすべてのエントリを置けば、それは問題になるかもしれません

Composite Key with EF 4.1 Code Firstで説明したようにあなただけの、通貨および外部IDで構成される複合主キーを、必要

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

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

その後、あなたはこのような「EUR」の行を読むことができます:

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

ありがとうございます。それはうまく動作します。 – Smilley

0

Entity Frameworkで生SQLクエリを実行できます。このように:

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

また、それは、よりきちんと作り、あなたはパラメータを送信し、そのパラメータに基づいてSELECTステートメントを実行するストアドプロシージャを作成することができます。次に、Entityフレームワークを使用して、そのプロシージャを呼び出して結果をList<Entry>にマップします。

しかし、私がコメントで述べたように私は個人的にはCurrenyCodeという列を持つテーブルを1つしか持たないことを好みます。正確に同じ構造であるが異なるデータを持つ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は、DbContextでDbSet に1つのエンティティクラスTしか使用できないため、動作しません。最後にフィールド通貨を私のクラスに導入しなければならなかった。 – Smilley

+0

@Smilley私はあなたが継承を使用し、Entryが単なる抽象基本クラスであれば動作するはずだと思います。とにかく、CodeCasterによって提案された解決策はより単純であるようです。 – 3615

関連する問題