6

私は関数を持っています:

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

...質問をするのに理由、問題、実際の例、または研究努力が必要だというわけではありません。

4

1 に答える 1