1

http://www.albahari.com/nutshell/predicatebuilder.aspxからのこの例に従って

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);
}

同様の要件がありますが、最初にANDクエリを実行する必要があり、次に上記の例とは異なり、一連のフィールド名とそれぞれで検索する値があります。フィールド名と値はどちらも、ユーザーが通過するまで不明です。私は最終的に以下のコードのようなものを実行しましたが、これは機能しますが、明らかに非常に緊密に結合されています。

 IEnumerable<someClass> qry = context.someClass;
 var pb = PredicateBuilder.True<someClass>();

 foreach (customClass rule in Filters)
            {


                switch ( rule.field)
                    {
                    case "FirstName":
                            pb = pb.And(p=>p.FirstName.Contains(rule.data));
                            break;
                    case "LastName":
                            pb = pb.And(p=>p.LastName.Contains(rule.data));
                            break;
                    case "City":
                           pb = pb.And(p=>p.City.Contains(rule.data));
                           break;

                    }

                qry.AsQueryable().Where(pb);
            }
            return qry;

上からわかるように、Ruleクラスにはfieldプロパティとdataプロパティがあります。理想的なのは、predicatebuilderを動的に作成できるかどうかです。

filterClause = "p=>p." + rule.field + ".Contains(" + rule.data + ")";


pb = pb.And(filterClause);

qry.AsQueryable().Where(pb);

ご入力いただきありがとうございます

4

0 に答える 0