【问题标题】:PredicateBuilder cannot convert to IQueryable?PredicateBuilder 无法转换为 IQueryable?
【发布时间】:2012-01-30 16:40:45
【问题描述】:

我有一个功能:

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

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

【问题讨论】:

    标签: linq iqueryable predicate predicatebuilder


    【解决方案1】:

    PredicateBuilder 需要一个IQueryable&lt;T&gt; 来发挥它的魔力。只需将示例中的最后一行更改为

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

    让它工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2020-01-14
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      相关资源
      最近更新 更多