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

如何在ASP.NET MVC中用EF Core与C#返回带各类型书籍数量的数据?

解决方案

你可以通过LINQ投影结合导航属性(或手动关联)来实现,以下是几种常用的方法:

方法1:投影到匿名类型(快速测试/临时使用)

如果只是临时需要数据,不需要定义额外类,可以直接投影到匿名类型,同时包含 Genre 实体和对应的书籍数量:

var data = await _context.Genres
    .Select(g => new
    {
        Genre = g,
        BookCount = g.Books.Count()
    })
    .ToListAsync();

说明:假设你的 Genre 实体已经配置了一对多的导航属性 ICollection<Book> Books,EF Core 会自动将 Count() 翻译成数据库层面的统计SQL,不会加载所有书籍数据,性能高效。

方法2:投影到自定义DTO/ViewModel(推荐用于业务场景)

如果需要在业务逻辑中复用这类数据,建议定义一个专门的DTO类:

// 先定义DTO类
public class GenreWithBookCountDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    // 按需添加Genre的其他属性
    public int BookCount { get; set; }
}

// 然后执行查询
var data = await _context.Genres
    .Select(g => new GenreWithBookCountDto
    {
        Id = g.Id,
        Name = g.Name,
        BookCount = g.Books.Count()
    })
    .ToListAsync();

方法3:手动关联(未配置导航属性时使用)

如果没有在实体中配置导航属性,可以通过 GroupJoin 手动关联两张表并统计:

var data = await _context.Genres
    .GroupJoin(
        _context.Books,
        genre => genre.Id,          // Genre表的关联键
        book => book.GenreId,       // Book表的关联键
        (genre, relatedBooks) => new
        {
            Genre = genre,
            BookCount = relatedBooks.Count()
        })
    .ToListAsync();

内容的提问来源于stack exchange,提问作者D.Man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:42:33