PredicateBuilder не может конвертировать в IQueryable? - PullRequest
5 голосов
/ 30 января 2012

У меня есть функция:

private IEnumerable<Promotion> MatchesKeyword(IEnumerable<Promotion> list, String keyword)
{
   ...snip...
}

, которая сейчас выполняет запрос LINQ:

private IEnumerable<Promotion> MatchesKeyword(IEnumerable<Promotion> list, String keyword)
{
   return list.Where(item => item.Name.ContainsText(keyword)
      || item.Description.ContainsText(keyword)
      ...snip...
   );
}

Этот код работает достаточно хорошо.

Но мне нужно конвертировать , чтобы использовать PredicateBuilder:

private IEnumerable<Promotion> MatchesKeyword(IEnumerable<Promotion> list, String keyword)
{
   var predicate = PredicateBuilder.False<Promotion>();     

   predicate = predicate.Or(item => item.Name.ContainsText(keyword)
         || item.Description.ContainsText(keyword)
         ...snip...
   );

   return list.Where(predicate);
}

, который, как ни странно, не компилируется.Неправильная строка:

return list.Where(predicate);

Вы можете выбрать ошибки:

  • Аргумент экземпляра: невозможно преобразовать из 'System.Collections.Generic.IEnumerable' в 'System.Linq.IQueryable '
  • ' System.Collections.Generic.IEnumerable 'не содержит определения «Где» и наилучшей перегрузки метода расширения «System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func) 'содержит недопустимые аргументы
  • Аргумент 2: невозможно преобразовать из' System.Linq.Expressions.Expression> 'в' System.Func '

Что такоепроблема?IEnumerable входит, IEnumerable выходит.

Я буду честен, я прочитал страницу PredicateBuilder и я не понимаю любой этого.


A подсказка из почему мне нужно изменить на PredicateBuilder:

private IEnumerable<Promotion> MatchesKeyword(IEnumerable<Promotion> list, String keyword)
{
   var predicate = PredicateBuilder.False<Promotion>();     

   predicate = predicate.Or(item => item.Name.ContainsText(keyword)
         || item.Description.ContainsText(keyword)
         ...snip...
   );

   DateTime dt = TryStrToDate(keyword);
   if (dt)
       predicate = predicate.Or(item => item.PromotionDate == dt);

   return list.Where(predicate);
}

... не то чтобы мне нужен был повод, проблема, практический пример или исследовательская работа, чтобы задать вопрос.

1 Ответ

10 голосов
/ 31 января 2012

PredicateBuilder требуется IQueryable<T>, чтобы творить чудеса. Просто измените последнюю строку в вашем примере на

return list.AsQueryable().Where(predicate);

, чтобы заставить это работать.

...