【问题标题】:LINQ PredicateBuilder multiple OR starting with PredicateBuilder.True<>LINQ PredicateBuilder 多个 OR 以 PredicateBuilder.True<> 开头
【发布时间】:2011-06-19 16:54:08
【问题描述】:

我有一个这样的实体:

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

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

勺刀叉

将在@987654323 中搜索 spoon or knife or fork @ 财产。我在Product 上为PredicateBuilder 引入了一种新方法,如下所示:

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&lt;Product&gt;() 开头,无论我输入什么关键字,我都会得到所有Products 的列表。如果我以PredicateBuilder.False&lt;Product&gt;() 开头,如果用户输入关键字,它会起作用,但如果没有,则返回列表为空,因为所有内容都匹配 false

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

【问题讨论】:

    标签: c# linq filter where-clause predicatebuilder


    【解决方案1】:
    var predicate = (keywords.Count() > 0)
        ? PredicateBuilder.False<Product>()
        : PredicateBuilder.True<Product>();
    

    【讨论】:

    • 是的,这样最好,但他特意要了一个不检查列表是否为空的方法。
    • 嗯,最好我想这样做。我做了if (!keywords.Any()) return PredicateBuilder.True&lt;Product&gt;(),但我想看看是否有其他解决方案。
    • 最佳,检查空数组有什么问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多