Динамический LINQ с использованием linqkit

Следуя этому примеру из 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 имеет поле и свойство данных. Было бы идеально, если бы я мог динамически создавать predicatebuilder , что-то вроде

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


pb = pb.And(filterClause);

qry.AsQueryable().Where(pb);

Заранее спасибо за любые материалы


person shai    schedule 23.01.2013    source источник
comment
это выглядит нормально для меня, вы получаете какую-либо ошибку с этим??   -  person Gopesh Sharma    schedule 23.01.2013
comment
Нет, я ищу лучший способ добиться того же результата... если это возможно   -  person shai    schedule 23.01.2013
comment
Вы имели в виду, что второй бит кода с filterClause выглядит для вас нормально? Ну, predicatebuilder принимает только аргументы функции, поэтому строковый аргумент не работает. Выдает ошибку   -  person shai    schedule 23.01.2013
comment
Вы можете посмотреть этот ответ - stackoverflow.com/a/2297519/201648. Похоже, Dynamic Linq может быть ответом на ваш вопрос — weblogs.asp.net/scottgu/archive/2008/01/07/   -  person Aaron Newton    schedule 24.01.2013
comment
Я сталкиваюсь с точно такой же проблемой.   -  person Lei Yang    schedule 29.07.2013
comment
Даже без LinqKit вы можете сказать условие вроде from x in xs where x.ok? x.a : x.snd? x.b : x.c select ... или использовать let tmp = x?a:b select tmp..., и EF это поймет.   -  person Tuomas Hietanen    schedule 01.09.2016