私は関数を持っています:
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...
);
}
このコードは十分に機能します。
しかし、私はそれを使用するように変換する必要があります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
出る。
正直なところ、このページを読んで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);
}
...質問をするのに理由、問題、実際の例、または研究努力が必要だというわけではありません。