我有一个LINQ查询(将针对DbContext执行),我首先使用我事先知道的一些条件构建。
var r = from p in db.People
where blah
select p;
然后我有一堆搜索条件,以数组(string [])的形式提供。如果我想做一个AND,这很容易:
foreach (string s in searchParameters)
{
r = from r1 in r
where r1.field == s
select r1;
}
但是,我现在需要以OR方式使用这些参数。一种解决方案是执行以下操作:
var results = new List<IEnumerable<RowType>>();
foreach (string s in searchParameters)
{
var r2 = from r1 in r
where r1.field == s
select r1;
results.Add(r2);
}
然后,最后,在“结果”中执行所有条目的UNION。但是,这将转化为对数据库进行更加不必要的复杂查询,并且还会引入可能重复的行,然后我需要对其进行重复数据删除。
是否有一种简单而有效的方式来实现我想要做的事情?
由于
答案 0 :(得分:0)
你需要使用PredicateBuilder
,如果我正确的你正在进行单一查询,你需要条件
IQueryable<Product> SearchProducts (params string[] keywords)
{
var predicate = PredicateBuilder.False<Product>();
foreach (string keyword in keywords)
{
string temp = keyword;
predicate = predicate.Or (p => p.Description.Contains (temp));
}
return dataContext.Products.Where (predicate);
}
答案 1 :(得分:0)
您可以使用System.Linq.Dynamic package available on Nuget。您还可以关注this guide如何使用该软件包。
在您的情况下,我相信查询可能是:
var query = IQueryable<DataType>();
foreach(string parameter in searchParameters)
{
query = query.Where("fieldName ==" + parameter );
}
// call the LINQ query at the end when all the conditions are built
var results = query.Select(q => q.field).ToList();
这可能适用于您的情况,否则您可以根据Pranay的建议使用谓词构建器。