如何创建动态 LINQ 查询 where 子句
本文关键字:LINQ 查询 where 子句 动态 何创建 创建 | 更新日期: 2023-09-27 18:32:21
如何创建一个基于列表的具有多个OR的where子句?
我知道这行不通,但这就是我想要实现的目标。我还没有找到合适的方法。对于传入的每个字符串,我需要添加一个 OR where 子句。该列表可能包含多个标签字符串,我需要查询为每个标签字符串添加一个 OR where 子句。
public void GetItems(List<String> tagsToGet){
var tagQuery = from tag in ParseObject.GetQuery("Tag")
foreach(string tagToGet in tagsToGet){
where tag.Get<string>("name") == tagToGet || // next loop
}
select tag;
}
你可以使用方法链:
public void GetItems(List<String> tagsToGet){
var tagQuery = ParseObject.GetQuery("Tag");
foreach(string tagToGet in tagsToGet)
{
tabQuery = tabQuery.Where(w => w.Get<string>("name") == tagToGet).AsEnumerable(); || // next loop
}
}
看看 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);
}
如果使用实体框架进行查询,请将最后一行更改为:
return objectContext.Products.AsExpandable().Where (predicate);
你想要使用动态 LINQ。获取NuGet package System.Linq.Dynamic 并在此处查看示例:http://weblogs.asp.net/ricardoperes/dynamic-linq
这应该有效:
where tagsToGet.Contains(tag.Get<string>("name"))
或可能
where t=> tagsToGet.Any(ttg => String.Equals(ttg, t.Get<string>("name"), StringComparison.CurrentCultureIgnoreCase))
显然,您可以用您喜欢的任何其他方式替换比较。
另一种选择,更易于理解:
var tagQuery = from tag in ParseObject.GetQuery("Tag")
join tagToGet in tagsToGet
on tagToGet equals tag.Get<string>("name")
select tag;