LINQ PredicateBuilder 多个 OR 以 PredicateBuilder.True<> 开头

Dan*_* T. 5 c# linq filter where-clause predicatebuilder

我有一个这样的实体:

public class Product()
{
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想在Name属性上搜索关键字,以便对它们进行 OR 运算。换句话说,搜索:

勺子刀叉

将在物业中寻找勺子 刀子 叉子Name。我为PredicateBuilderon引入了一种新方法,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;
}
Run Code Online (Sandbox Code Playgroud)

我在我的 Web 服务方法之一中像这样使用它:

var keywords = Request.QueryString["q"].Split(' ');
var products = Repo.GetAll<Product>(); // get all the products from the DB
products = products.Where(Product.ContainsKeywords(keywords));
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是用户可能选择不进行关键字搜索,在这种情况下keywords数组将为空。如果我从 开始PredicateBuilder.True<Product>(),我会得到一个所有的列表Products,不管我输入了什么关键字。如果我开始PredicateBuilder.False<Product>(),它在用户输入关键字时工作,但如果不是,那么返回列表是空的,因为一切都匹配false

我如何解决这个问题以获得我想要的行为,即Products如果没有提供关键字,则返回所有列表,如果提供Products了关键字,则仅返回与关键字匹配的列表?我知道我可以在进行任何处理之前检查一下关键字数组是否为空,但如果可能的话,我想PredicateBuilder自动处理这种情况。

Kri*_*nov 3

var predicate = (keywords.Count() > 0)
    ? PredicateBuilder.False<Product>()
    : PredicateBuilder.True<Product>();
Run Code Online (Sandbox Code Playgroud)