Нужна помощь в устранении ошибки в предикатах для оператора А в LINQ - PullRequest
1 голос
/ 16 января 2009

Я попал в проблему предиката А оператора. Код:

SQLDBDataContext sqlDS = new SQLDBDataContext();
Expression<Func<User,bool>> pred = null; //delcare the predicate to start with.

if (Request["Name"] != null && ! Request["Name"].Equals(string.Empty))
{  
   pred = c => ( c.ContactFirst.Contains(Request["Name"]) || c.ContactLast.Contains(Request["Name"]));
}

if (Request["Company"] != null && !Request["Company"].Equals(string.Empty))
{
   if (pred == null) { 
      pred = (c => c.Company.Contains(Request["Company"])); 
   }
   else {
      pred = pred.And(c => c.Company.Contains(Request["Company"]));
   }
}

ошибка в строке: [else {pred = pred.And (c =>] Нет перегрузки для метода «И» принимает аргументы «1»

Может кто-нибудь сказать мне, как использовать. И оператор для предиката.

Заранее спасибо.
Анил

Ответы [ 2 ]

4 голосов
/ 16 января 2009

And - бинарный оператор А; Вы имеете в виду Expression.AndAlso, т.е.

pred = Expression.AndAlso(pred, {new bit})

Однако я подозреваю, что вы делаете это нелегко. Проще использовать такие вещи, как:

IQueryable<Foo> source = ...
if(condition1) {
    source = source.Where(predicate1);
}
if(condition2) {
    source = source.Where(predicate2);
}

Например:

IQueryable<User> source = ...
string name = Request["Name"];
if(!string.IsNullOrEmpty(name)) {
    source = source.Where(user => user.ContactFirst.Contains(name)
               || user.ContactLast.Contains(name));
}
string company = Request["Company"];
if(!string.IsNullOrEmpty(company)) {
    source = source.Where(user => user.Company.Contains(company));
}
0 голосов
/ 16 января 2009

Изящной маленькой библиотекой, которую стоит иметь, является Predicate Builder из C # 3.0 в двух словах: http://www.albahari.com/nutshell/predicatebuilder.aspx

...