我正在尝试使用 where 子句过滤表。当我单独编写查询时,它们工作正常:
IQueryable<Movie> movies = db.Movies;
movies = movies.Where(movie =>
movie.MovieToGenres.Any(genreItem => genreItem.Genre_ID == 34)
);
movies = movies.Where(movie =>
movie.MovieToGenres.Any(genreItem => genreItem.Genre_ID == 35)
);
但是我必须在 foreach
循环中使用它:
List<int> genre_ids = new List<int>();
genre_ids.Add(34);
genre_ids.Add(35);
IQueryable<Movie> movies = db.Movies;
foreach (var genre_id in genre_ids)
{
movies = movies.Where(movie =>
movie.MovieToGenres.Any(genreItem => genreItem.Genre_ID == genre_id)
);
}
当我这样做时,在 SQL 端查询参数是 @p0 = 35
,@p1 = 35
而不是 @p0 = 34
,@p1 = 35
。我不知道为什么。
最佳答案
这是capturing the loop variable的另一种情况.只有一个 genre_id
变量被所有的 lambda 表达式捕获。通过在每次迭代中引入一个新变量并捕获它来解决这个问题很容易:
foreach (var genre_id in genre_ids)
{
int genreCopy = genre_id;
movies = movies.Where(movie => movie.MovieToGenres.Any(
genreItem => genreItem.Genre_ID == genreCopy));
}
在 C# 5 中,这可能是不必要的 - 行为可能正在改变。
关于Linq To Sql Multiple Where 在 Foreach 循环中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7288238/