我正在尝试使用 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/