我有一个函数:
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);
}
...不是说我需要一个理由,问题,实际的例子,或研究工作来提出一个问题。
2条答案
按热度按时间6uxekuva1#
PredicateBuilder需要一个
IQueryable<T>
来实现它的魔力。才能成功
lhcgjxsq2#
你也可以把expession编译成Func〈T,bool〉
它适用于Linq Where参数。