You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:32:27