2016-09-14 20 views
0

いくつかの条件に基づいて2つの異なるビューを照会しています。コレクションを返し、コレクションを使用して操作を実行しています。Listの代わりに2つの異なるListクラスのGeneric List <dynamic>

List<dynamic> query = new List<dynamic>(); 
      if (source == 1) 
      { 
       query = this.db.table1.Where(x => x.DATA_SRC_ID == source || x.DATA_SRC_ID == 3).ToList<dynamic>(); 
      } 
      else if (source == 2) 
      { 
       query = this.db.table2.Where(x => x.DATA_SRC_ID == 3).ToList<dynamic>(); 
      } 

      var result = query.Where(x => x.client_id == clientId).ToList(); 

ビュー「TABLE1」はlist<dynamic>に変換し、巨大な記録手段が含まれている場合、パフォーマンスが低下します。これを行うための他の良い方法がありますか?いくつかの一般的なオブジェクトのようにifとelseの両方から戻ってくる必要があります。 (エンティティ・フレームワークにDB最初のアプローチを使用して)dBのコンテキスト下

private entities db = new entities(); 

ビュー/テーブル

table1 
table2 

代わりにList<dynamic>二つの異なるクラスのリストを装飾する方法。

+0

可能なクラスは、同じ共通インターフェイス(または基本クラス)を実装する必要があります。リスト 'List 'を作成するだけです。それにもかかわらず: "リストはパフォーマンスを低下させる" Sais誰ですか? – HimBromBeere

+0

その 'if'と' else if'の両方の中に 'result = ...'を入れてみませんか?コードを少し長くするだけでなく、理解と管理が容易になり、 'var query = ...'を使用することができます。 –

+0

@KeyurPATELはいあなたは正しいです。しかし、私は他のものもたくさんやっている結果を得た後。 – SivaRajini

答えて

4

最もナイーブimplementaion(ない最高の1)は、単にタイプobjectのリストを作りたいクラスにすべての項目をキャストすることです:

var list = new List<object>(); 
list.Add(newInstanceOfA); 
list.Add(newInstanceOfB); 

今、あなたは現在の要素の種類に区別しなければなりません:

foreach(var element in list) 
{ 
    var b = element as B(); 
    if(b != null) 
    { 
     // do something with b 
    } 
    else 
    { 
     a = (A) element;  // may fail if more types are possible 
     // do something wit a 
    } 
} 

両方のクラスが同じ共通のインターフェースを実装する場合、より良いは次のようになります。

interface IMyInterface 
{ 
    void DoSomething(); 
} 
class A : IMyInterface {} 
class B : IMyInterface {} 

query = this.db.table1 
    .Where(x => x.DNA_PGM_PRTN_ID == partitionId && (x.DATA_SRC_ID == source || x.DATA_SRC_ID == 3)) 
    .Cast<IMyInterface>().ToList(); 

それとも

query = this.db.table2 
    .Where(x => x.CLIENT_PGM_PRTN_ID == partitionId && (x.DATA_SRC_ID == source || x.DATA_SRC_ID == 3)) 
    .Cast<IMyInterface>().ToList(); 

repectivly:あなたは今、このような何かを行うことができ、あなたの例では

var list = new List<IMyInterface>(); 
list.Add(newInstanceOfA); 
list.Add(newInstanceOfB); 

foreach(var element in list) 
{ 
    element.DoSomething(); 
} 

は、今すぐ簡単に新しいリストを作成することができます。

EDIT:フィールドをいくつかの一般的なフォームに抽象化するには、リストを作成するインターフェイスではなく継承する抽象クラスを使用する必要がありますList<MyAbstractClass>

+0

両方のクラスが同じプロパティを共有している場合は、そうすることができます。プロパティが全く異なっていて、共通のものにそれらをラップできない場合は、なぜそれらを1つのリストに入れるのかを尋ねる必要があります(覚えておいてください。 – HimBromBeere

+0

ここでは、共通の関数ではなく、フィールドをマッピングしているため、抽象クラスはInterfaceよりも良いでしょう。 –

+0

@HimBromBeereインターフェイスでこれら5つの適合性を入れれば、両方のクラスが共通です。クエリ以外の資質 – SivaRajini

関連する問題