linq PredicateBuilder无法转换为IQueryable?

4nkexdtk  于 2023-04-09  发布在  其他
关注(0)|答案(2)|浏览(120)

我有一个函数:

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

这段代码运行得很好。
但是i need to convert it使用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”不包含“Where”的定义,并且最佳扩展方法重载“System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable,System.Func)”包含一些无效参数
  • 参数2:无法从“System.Linq.Expression.Expression〉”转换为“System.Func”

什么问题?IEnumerable进去,IEnumerable出来。
说实话,我读了the page on 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);
}

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

6uxekuva

6uxekuva1#

PredicateBuilder需要一个IQueryable<T>来实现它的魔力。

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

才能成功

lhcgjxsq

lhcgjxsq2#

你也可以把expession编译成Func〈T,bool〉

expression.Compile();

它适用于Linq Where参数。

相关问题