我有一个这样的实体:
public class Product()
{
public string Name { get; set; }
}
我想在属性上搜索关键字,Name
以便对它们进行 OR'ed。换句话说,搜索:
勺子刀叉
将在物业中寻找勺子 或 刀子 或 叉子。Name
我介绍了一种新的方法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
自动处理这种情况。