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

10-11 17:04