5

私はこのようなエンティティを持っています:

public class Product()
{
    public string Name { get; set; }
}

プロパティにキーワードの検索を実装してName、それらがORされるようにしたい。つまり、次の検索を行います。

スプーンナイフフォーク

宿泊施設でスプーン ナイフ フォークを検索しますName。私は次のような新しい方法を導入しましたPredicateBuilderProduct

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

4

1 に答える 1

3
var predicate = (keywords.Count() > 0)
    ? PredicateBuilder.False<Product>()
    : PredicateBuilder.True<Product>();
于 2011-02-02T02:39:10.083 に答える