gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:35:45 24 4
gpt4 key购买 nike

我有这样一个实体:

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

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

spoon knife fork

将在 Name 属性中搜索spoon or knife or fork .我在 PredicateBuilder 上为 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;
}

我在我的一种网络服务方法中像这样使用它:

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 自动处理这种情况。

最佳答案

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

关于c# - LINQ PredicateBuilder 多个 OR 以 PredicateBuilder.True<> 开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4870204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com