1

PredicateBuilder をさらに活用する方法についての簡単な質問です。以下のように動作します。

IQueryable<Product> SearchProducts (params string[] keywords)
{
  var predicate = PredicateBuilder.False<Product>();

  foreach (string keyword in keywords)
  {
    string temp = keyword;
    predicate = predicate.Or (p => p.Description.Contains (temp));
  }
  return dataContext.Products.Where (predicate);
}

問題は、任意のメンバーでも検索したい場合、つまり、関数 string[] をキーワードとして渡すだけでなく、fieldToSearch などの検索するフィールドも渡し、p=> p.Description を置き換える場合です。含む (一時)); fieldToSearch による検索を可能にする何かで?

これは可能ですか、それは悪い考えですか?

4

2 に答える 2

1

やりたいことには、Dynamic Linqの方が適切かもしれません。

タイプ セーフなクエリを作成することはほとんどのシナリオに適していますが、その場でクエリを動的に構築する柔軟性が必要な場合があります。たとえば、アプリケーション内にビジネス インテリジェンス UI を提供して、エンド ユーザーのビジネス アナリストがドロップダウンを使用して独自のカスタム クエリ/ビューをデータに基づいて構築および表現できるようにすることができます。

従来、これらの種類の動的クエリ シナリオは、多くの場合、文字列を連結して動的 SQL クエリを構築することで処理されていました。最近、LINQ を使用してこれらの種類のシナリオを処理する方法を尋ねるメールが何人かから届きました。以下の投稿では、LINQ チームが提供する動的クエリ ライブラリを使用して、LINQ クエリを動的に構築する方法について説明します。

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

于 2010-10-28T01:52:15.663 に答える
0

Expression<Func<Product,bool>>パラメータとしてを受け取る別のメソッドを用意してみませんか。次に、メソッドの外側で述語を作成し、それをパラメーターとして渡します。

IQueryable<Product> SearchProducts (Expression<Func<Product,bool>> selector )
{
    return dataContext.Products.Where( selector );
}

使用されます

var selector = PredicateBuilder.False<Product>()
                               .Or( p => p.Name == name )
                               .Or( p => p.Vendor == vendor );

products = repository.SearchProducts( selector );
于 2010-10-28T01:58:08.700 に答える