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

时间:2011-02-02 02:27:32

标签: c# linq filter where-clause predicatebuilder

我有一个这样的实体:

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

我想在Name属性上搜索关键字,以便它们被“删除”。换句话说,搜索:

  勺子刀叉

将在{{中搜索 spoon fork 1}}属性。我在Name PredicateBuilder上介绍了一种新方法,如下所示:

Product

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

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

我遇到的问题是用户可能选择不进行关键字搜索,在这种情况下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的列表关键字,如果他们提供?我知道在进行任何处理之前我可以检查关键字数组是否为空,但如果可能的话,我希望Products自动处理这种情况。

1 个答案:

答案 0 :(得分:2)

var predicate = (keywords.Count() > 0)
    ? PredicateBuilder.False<Product>()
    : PredicateBuilder.True<Product>();