首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ PredicateBuilder多重或从PredicateBuilder.True<>开始

LINQ PredicateBuilder多重或从PredicateBuilder.True<>开始
EN

Stack Overflow用户
提问于 2011-02-02 02:27:32
回答 1查看 3K关注 0票数 5

我有这样一个实体:

代码语言:javascript
复制
public class Product()
{
    public string Name { get; set; }
}

我希望在Name属性上实现对关键字的搜索,这样就可以对它们进行或编辑。换言之,寻找:

勺子刀叉

将在属性中搜索勺子、刀、叉。我介绍了一种用于PredicateBuilder on Product的新方法,如下所示:

代码语言:javascript
复制
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服务的方法中像这样使用它:

代码语言:javascript
复制
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列表。我知道我可以在进行任何处理之前检查关键字数组是否为空,但如果可能的话,我希望PredicateBuilder自动处理这个案例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-02 02:39:10

代码语言:javascript
复制
var predicate = (keywords.Count() > 0)
    ? PredicateBuilder.False<Product>()
    : PredicateBuilder.True<Product>();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4870204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档