Bug*_*llu 3 linq foreach search where linq-to-sql
我正在尝试使用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)
);
Run Code Online (Sandbox Code Playgroud)
但是我必须在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)
);
}
Run Code Online (Sandbox Code Playgroud)
当我这样做,SQL一边的查询参数@p0 = 35,@p1 = 35而不是@p0 = 34,@p1 = 35.我不知道为什么.
这是捕获循环变量的另一种情况.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));
}
Run Code Online (Sandbox Code Playgroud)
在C#5中,这可能是不必要的 - 行为可能正在改变.