私はこのようなエンティティを持っています:
public class Product()
{
public string Name { get; set; }
}
プロパティにキーワードの検索を実装してName
、それらがORされるようにしたい。つまり、次の検索を行います。
スプーンナイフフォーク
宿泊施設でスプーン 、 ナイフ 、 フォークを検索しますName
。私は次のような新しい方法を導入しましたPredicateBuilder
。Product
public static Expression<Func<Product, bool>> ContainsKeywords(params string[] keywords)
{
var predicate = PredicateBuilder.True<Product>();
foreach (var keyword in keywords)
{
var temp = keyword;
predicate = predicate.Or(x => x.Name.Contains(temp));
}
return predicate;
}
そして、私はWebサービスのメソッドの1つで次のように使用しています。
var keywords = Request.QueryString["q"].Split(' ');
var products = Repo.GetAll<Product>(); // get all the products from the DB
products = products.Where(Product.ContainsKeywords(keywords));
私が遭遇している問題は、ユーザーがキーワード検索を行わないことを選択する可能性があることです。その場合、keywords
配列は空になります。で始めるとPredicateBuilder.True<Product>()
、入力したキーワードに関係なく、すべてのリストがProducts
表示されます。で始めるとPredicateBuilder.False<Product>()
、ユーザーがキーワードを入力した場合は機能しますが、そうでない場合は、すべてが一致したため、リターンリストは空になりますfalse
。
キーワードが提供されていない場合はすべてのリストを返し、キーワードが提供されている場合はキーワードに一致するものProducts
のみのリストを返すという目的の動作を実現するには、これを修正するにはどうすればよいですか?処理を行う前に、keywords配列が空かどうかを確認できることはわかっていますが、可能であれば、このケースを自動的に処理しProducts
たいと思います。PredicateBuilder