2016-04-12 5 views
1

多くの場所を検索した後、私はあなたの助けを求めることになった。述語なしでIQueryable拡張メソッドを作成

問題はこれです。IQueryableを使用してただし条件なしでフィルタを作成する必要があります。例えば言って私は次のクラスがあります。代わりの

var ex1 = MyClass.MyFilter<P1>; 

public class MyClass: IQueryable 
{ 
    public string P1 {get; set;} 
    public string P2 {get; set;} 
} 

は今、私はこのクラスのフィルタまたは私はこのような例のためにそれを呼び出すことができますそのことについては他のクラスを必要とします

var ex = someCollection.Where(p => p.SomeProperty == P1); 

グリッドと列にプロパティやクラスをバインドするときに、このような何かは、ASP.NETで剣道グリッドによって使用されています。どんなアイデアやアドバイスも高く評価されます!ありがとうございました!

答えて

0

IQueryableは他のデータ型と同じように、その型のオブジェクトを受け入れて返す拡張関数を作ることができます。

public static class QueryExtensions 
    { 
     public IQueryable<MyClass> MyFilter(this IQueryable<MyClass> query, string p1) 
     { 
      return query.Where(p => p.SomeProperty == p1); 
     } 
    } 

そして、それを使用する:

var ex1 = someCollection.MyFilter(P1); 
+0

をいただき、ありがとうございます答えのbuffjape!もう一つの質問:関数自体の内部でも述語表現を避ける方法はありますか?私はEFまたはnHibernateからのDBクエリでこのフィルタを使用できるようにしたいと思います。ありがとうございました ! –

+0

それは両方のためにうまくいくはずです - 試してみてください。 – buffjape

+0

これはかなりうまく動作します!ありがとうございました ! SomePropertyを変数に入れる方法もありますか? –

1

私はあなたがやろうとしているものに少しわからないけど、それはの線に沿って何かである:

public class MyClass 
    { 
     public string P1 { get; set; } 
    } 

    public static class QueryableExtensions 
    { 
     public static IQueryable<T> MyFilter<T>(this IQueryable<T> queryable, string value) where T : MyClass 
     { 
      return queryable.Where(arg => arg.P1 == value); 
     } 
    } 
+0

こんにちはjanhartmann!はい、近くの何か!また、私はreturn文でラムダを取り除こうとしていますが、私はジェネリック宣言を使ってそれをやろうとしています。 –

+0

MyClassの代わりにインターフェイスを導入して使用することをお勧めします。次に、他のクラスがプロパティを含むインタフェースを実装するようにします。 – janhartmann

+0

あなたが好きなインターフェースや抽象クラス。 – janhartmann