2016-05-17 3 views
0

linqでdynamicに相当するものが必要です。 データベース内のタイプTのすべてのアクティブなデータを返したいとします。問題は、すべてのテーブルに「アクティブ」があるわけではないことです。だから私のようなものが必要になります。LinQの動的変数

public static List<T> get<T>() where T : class 
{ 
    if (typeof(T).GetProperty("Activo")!=null) 
    { 
     return (from c in context.Set<T>().AsQueryable() 
       where c.Activo //I know for sure it have an Activo property 
       select c).ToList(); 
    } 
    else 
    { 
    return (from c in context.Set<T>().AsQueryable() 
      select c).ToList(); 
    }   
} 

どのように私はきゅう「はACTIVO」プロパティを使用するように強制することができますか?インタフェースdynamic変数

を使用して同じようにあなたが

public static List<T> get<T>() where T : class 
{ 
    var type = typeof(T); 
    var prop = type.GetProperty("Activo") 
    if (prop!=null) 
    { 
     return (from c in context.Set<T>().AsQueryable() 
      where prop.GetValue(c, null)=="xyz123" 
      select c).ToList(); 
    } 
    else 
    { 
     return (from c in context.Set<T>().AsQueryable() 
      select c).ToList(); 
    }   
} 

を使用する必要が

+0

両方の引数が両方とも引数を持たない場合、どのように負荷をかけて区別することができますか? – Aimnox

答えて

0

私はそれを実装することができない方式のタイプに渡す必要があるので、私が使用して好きではないことはできませんあなたがプロパティの名前を変更した場合、リフレクションコードが破損する可能性があるからです。私はクラスに特定のプロパティをインプリメントするinterfactをフックし、次に自分のインスタンス(比較する)がそのインタフェースを実装しているかどうかを確認することを好みます。

+0

インスタンスにプロパティがあるかどうかを確認するよりもインターフェイスがあるかどうかを確認する方がいいですか? LINQ to Entitiesは、メソッド 'System.Object GetValue(System.Object)'を認識しません。このメソッドはストア式に変換できません。 ' – Aimnox

+0

インスタンス特定のインターフェースをはるかに、よりクリーンに実装しています。例外として - 残念ながら、.AsList()を.AsQueryable()の後に追加する必要があります。つまり、結果セット全体がプロパティを評価する前にRAMに格納されます。あなたはそれが起こることを望むかもしれません。あなたの例は、結果がLinqからEntitiesへのものであることを示していませんでした。それは「インタフェース」アプローチも複雑にする可能性があります。 –