如何创建动态LINQ查询where子句

时间:2014-11-28 19:49:20

标签: c# linq

如何根据List创建一个包含多个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;
}

4 个答案:

答案 0 :(得分:0)

你可以使用方法链:

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
    }

}

答案 1 :(得分:0)

这应该有效:

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;

答案 2 :(得分: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);
}

如果使用Entity Framework进行查询,请将最后一行更改为:

return objectContext.Products.AsExpandable().Where (predicate);

答案 3 :(得分:0)

您想使用Dynamic LINQ。获取NuGet包System.Linq.Dynamic并在此处查看示例:http://weblogs.asp.net/ricardoperes/dynamic-linq