PredicateBuilder无法转换为IQueryable?

Ian*_*oyd 5 linq predicate iqueryable predicatebuilder

我有一个功能:

private IEnumerable<Promotion> MatchesKeyword(IEnumerable<Promotion> list, String keyword)
{
   ...snip...
}
Run Code Online (Sandbox Code Playgroud)

现在执行LINQ查询:

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

这段代码运行得很好.

我需要将其转换为使用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);
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,这不会编译.失败的路线是:

return list.Where(predicate);
Run Code Online (Sandbox Code Playgroud)

您可以选择错误:

  • 实例参数:无法从'System.Collections.Generic.IEnumerable'转换为'System.Linq.IQueryable'
  • 'System.Collections.Generic.IEnumerable'不包含'Where'的定义和最佳扩展方法重载'System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable,System.Func)'有一些无效的参数
  • 参数2:无法从'System.Linq.Expressions.Expression>'转换为'System.Func'

有什么问题?IEnumerable进去,IEnumerable出来.

我会说实话,我读了这个页面PredicateBuilder,我不明白其中任何一个.


一个淡淡,为什么我需要改变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);
}
Run Code Online (Sandbox Code Playgroud)

......并不是说我需要一个理由,问题,实际例子或研究工作来提问.

afr*_*hke 10

PredicateBuilder需要IQueryable<T>做一个魔术.只需将示例中的最后一行更改为

return list.AsQueryable().Where(predicate);
Run Code Online (Sandbox Code Playgroud)

使它工作.