【发布时间】: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<Product>() 开头,无论我输入什么关键字,我都会得到所有Products 的列表。如果我以PredicateBuilder.False<Product>() 开头,如果用户输入关键字,它会起作用,但如果没有,则返回列表为空,因为所有内容都匹配 false。
如何解决此问题以获得我想要的行为,即如果未提供关键字,则返回所有 Products 的列表,并仅返回与关键字匹配的 Products 的列表(如果它们是)假如?我知道我可以在进行任何处理之前检查关键字数组是否为空,但如果可能的话,我希望 PredicateBuilder 自动处理这种情况。
【问题讨论】:
标签: c# linq filter where-clause predicatebuilder