如何在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
相关产品推荐
相关产品推荐

