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)
这段代码运行得很好.
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)
您可以选择错误:
有什么问题?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)
使它工作.
| 归档时间: |
|
| 查看次数: |
2673 次 |
| 最近记录: |