ASP.NET Core MVC中按Genre展示对应Movie列表的故障解决请求
问题解决与优化方案
一、直接修复当前数据检索问题
你当前的核心问题是方法名不匹配:ViewModel的GetMoviesByGenreId调用的是仓库的同名方法,但你仓库里定义的方法是GetGenresWithMovies,导致实际调用时找不到正确的逻辑,这是数据检索失败的直接原因。
1. 修正仓库方法命名与实现
将仓库方法名改为和ViewModel调用一致的名称,同时优化查询逻辑:
// GenreRepository.cs public IQueryable<Movie> GetMoviesByGenreId(int genreId) { // 若页面需要显示流派名称,可启用Include加载关联实体 return _dbContext.Movies .Where(x => x.GenreId == genreId) // .Include(x => x.Genre) .AsNoTracking(); // 只读场景添加AsNoTracking提升查询性能 }
2. 完善ViewModel空值判断
构造函数中CurrentGenre可能为null(数据库无流派数据时),需添加空值判断避免空引用异常:
// GenresViewModel.cs public GenresViewModel(MovieDbContext context) { _repo = new GenreRepository(context); GenreList = GetAllGenres(); CurrentGenre = GenreList.FirstOrDefault(); // 空值安全处理 MoviesList = CurrentGenre != null ? GetMoviesByGenreId(CurrentGenre.Id) : new List<Movie>(); } public List<Movie> GetMoviesByGenreId(int genreid) { return _repo.GetMoviesByGenreId(genreid).ToList(); }
二、高效替代方案:一次性获取所有流派及对应电影
如果需要在页面展示全部分流派及其关联电影(比如流派分组展示、侧边导航联动),可以直接查询所有流派并预加载关联电影,减少数据库查询次数:
1. 完善实体类导航属性
在Genre类中添加Movies集合导航属性:
public class Genre { public int Id { get; set; } public string Genre1 { get; set; } // 添加关联电影集合导航属性 public virtual ICollection<Movie> Movies { get; set; } = new List<Movie>(); // Other genre properties }
2. 仓库添加批量查询方法
// GenreRepository.cs public List<Genre> GetAllGenresWithMovies() { return _dbContext.Genres .Include(g => g.Movies) // 预加载关联的电影集合 .AsNoTracking() .ToList(); }
3. ViewModel与页面展示
// GenresViewModel.cs public List<Genre> GenresWithMovies { get; set; } public GenresViewModel(MovieDbContext context) { _repo = new GenreRepository(context); GenresWithMovies = _repo.GetAllGenresWithMovies(); // 其他属性初始化... }
Razor视图展示示例:
@model GenresViewModel @foreach (var genre in Model.GenresWithMovies) { <h3>@genre.Genre1</h3> <ul> @foreach (var movie in genre.Movies) { <li>@movie.Title</li> } </ul> }
三、额外优化建议
- 依赖注入优化:不要在ViewModel中直接实例化
GenreRepository,通过构造函数注入仓库实例,符合ASP.NET Core设计规范。 - 分页处理:电影数量较多时,在查询中添加
Skip和Take实现分页,避免一次性加载大量数据。 - 异步查询:将仓库方法改为异步版本(返回
Task<IQueryable<Movie>>或Task<List<Movie>>),提升Web应用响应性能。
内容的提问来源于stack exchange,提问作者LONDON T RICHARDSON
相关产品推荐
相关产品推荐

