2012-03-12 16 views
2

where句で使用するメソッドに文字列としてLinqクエリを送信しようとしています。 IEnumerableはこのためには機能しないので、私はIEnumerableをIQueryableに変換しましたが、まだそれはエラーをスローします。次のコードです:linq where節に文字列を使用する方法は?

public static void FilterData(string Query) 
     { 
      if((List<MemberMaintenanceData>)HttpContext.Current.Session["Allmembers"] != null) 
      { 
       //Get the IEnumerable object colection from session 
       var data = (List<MemberMaintenanceData>) HttpContext.Current.Session["Allmembers"]; 
       //Convert it to IQueryable 
       IQueryable<MemberMaintenanceData> queryData = data.AsQueryable(); 
       //This line doesn't compile!! 
       queryData = queryData.Where(Query); 
       HttpContext.Current.Session["Allmembers"] = queryData.AsEnumerable().ToList(); 
      } 

     } 

私のようなクラスを考えると、クエリ

答えて

1

として "A => a.AccountId == 1000" 渡す意図:あなたはできるはずです

public class foo 
{ 
    public int AccountID {get;set;} 
} 

Expression<Func<foo, bool>> filter = f => f.AccountID == 1000; 

これをクエリとして渡します。それは本当にあなたがこれを行うことができ、文字列として必要とされている場合:

filter.ToString(); 
0

その後、LINQクエリで使用することができますラムダ式に文字列を解析するために、マイクロソフトが提供する無料(オープンソース)ライブラリは、があります。また、文字列パラメータをとるWhere()などの標準クエリ演算子のバージョンも含まれています。あなたはそれがdescribed in Scott Guthries blog post on Dynamic Linq.

たとえば、あなたは(スコット・ガスリーのリンクからスニペットから適応)このようなクエリを行うことができます見つけることができます

// imagine these have come from a drop down box or some other user input... 
string thingToSelectBy = "City"; 
string citySelectedByUser = "London"; 
int minNumberOfOrders = 10; 

string whereClause = String.Format("{0} = @0 and Orders.Count >= @1", thingToSelectBy); 

var query = db.Customers 
     .Where(whereClause, citySelectedByUser, minNumberOfOrders) 
     .OrderBy("CompanyName") 
     .Select("new(CompanyName as Name, Phone"); 

ザ・はthiswコードスニペットで句を使用すると、where句を作成する方法を示していますどこにパラメータ化された文字列を使用して、実行時に、たとえばユーザ入力に基づいてパラメータの値を動的に注入します。これはどのタイプのパラメータでも機能します。あなたの例では

、where句が有効なので、

whereClause = "AccountId = 1000"; 

になります

var newFilteredQueryData = queryData.Where("AccountId = 1000"); 

そのリンクはまた、あなたがソースコードをダウンロードできる場所が含まれており、のようなものをやっているだろう動的クエリAPIと表現言語を記述した包括的なドキュメント。

+0

ダイナミックlinqライブラリは、文字列ではなく整数に対してのみ機能します。また、少なくとも文字列を使用したサンプルは見ていません。この件に関しては非常に多くの記事やブログがあり、それらのすべてが例として整数を使用しています!私が照会しなければならないAccountIdは文字列です。 – user466663

+0

「文字列ではなく整数のみで動作する」という意味はよく分かりません。動的クエリ言語のドキュメンテーションを見ると、intだけでなくあらゆるタイプで動作することがわかります。私が提案したリンクの最上部にあるAPIドキュメンテーションのスクリーンショットでは、文字列を使用する例を示しています。私は少しこれを表示するために私の答えを更新しました。 –

関連する問題