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