【发布时间】: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