如何在LINQ中动态将OR运算符添加到WHERE子句

如何在LINQ中动态将OR运算符添加到WHERE子句

我有一个可变大小的字符串数组,并且我试图以编程方式遍历该数组并匹配表中的所有行,其中“标签”列中至少包含该数组中的一个字符串。这是一些伪代码:

 IQueryable<Songs> allSongMatches = musicDb.Songs; // all rows in the table

我可以很容易地查询一组固定字符串的表过滤,如下所示:
 allSongMatches=allSongMatches.Where(SongsVar => SongsVar.Tags.Contains("foo1") || SongsVar.Tags.Contains("foo2") || SongsVar.Tags.Contains("foo3"));

但是,这不起作用(出现以下错误:“带有语句主体的lambda表达式无法转换为表达式树”)
 allSongMatches = allSongMatches.Where(SongsVar =>
     {
       bool retVal = false;
       foreach(string str in strArray)
       {
         retVal = retVal || SongsVar.Tags.Contains(str);
       }
       return retVal;
     });

有人可以告诉我正确的策略来实现这一目标吗?我对LINQ还是陌生的:-)

最佳答案

您可以使用 PredicateBuilder 类:

var searchPredicate = PredicateBuilder.False<Songs>();

foreach(string str in strArray)
{
   var closureVariable = str; // See the link below for the reason
   searchPredicate =
     searchPredicate.Or(SongsVar => SongsVar.Tags.Contains(closureVariable));
}

var allSongMatches = db.Songs.Where(searchPredicate);

LinqToSql strange behaviour

关于linq - 如何在LINQ中动态将OR运算符添加到WHERE子句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/782339/

10-11 15:22