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

C#中将实体列表转换为视图模型列表出现空值错误如何解决

解决方案

你遇到的空引用异常主要来自两个常见的编码疏漏,不需要强制改用foreach循环,两种写法都可以实现需求,只要做好关联数据加载和空值保护即可:

错误原因

  1. EF(Entity Framework)查询所有出版商时没有预加载关联的Books导航属性,直接查询得到的Publisher对象中Books集合默认为null,映射时直接访问就会抛出空引用错误
  2. 映射逻辑没有对可能为null的关联集合做兜底处理

推荐实现(和你现有GetPublisherById逻辑对齐的LINQ写法)

public List<PublisherVM> GetAllPublishers()
{
    return _dbContext.Publishers
        // 预加载关联的书籍数据,如果你需要读取书籍的作者信息,还要加ThenInclude加载Authors关联
        .Include(p => p.Books)
        .ThenInclude(b => b.Authors)
        .Select(publisher => new PublisherVM
        {
            PublisherName = publisher.Name,
            // 空值保护:如果Books集合为null,返回空列表避免报错
            BookAuthors = publisher.Books == null 
                ? new List<BookAuthorsVM>() 
                : publisher.Books.Select(book => new BookAuthorsVM
                {
                    // 此处和你GetPublisherById方法中的字段映射逻辑保持一致即可
                    BookName = book.BookName,
                    AuthorNames = book.Authors?.Select(a => a.AuthorName).ToList() ?? new List<string>()
                }).ToList()
        }).ToList();
}

如果你偏好foreach循环写法,实现如下

public List<PublisherVM> GetAllPublishers()
{
    // 先把带关联数据的出版商列表查出来
    var allPublishers = _dbContext.Publishers
        .Include(p => p.Books)
        .ThenInclude(b => b.Authors)
        .ToList();
    
    var resultList = new List<PublisherVM>();
    foreach (var publisher in allPublishers)
    {
        var publisherVm = new PublisherVM
        {
            PublisherName = publisher.Name,
            BookAuthors = new List<BookAuthorsVM>()
        };
        
        // 避免空集合报错
        if (publisher.Books != null)
        {
            foreach (var book in publisher.Books)
            {
                publisherVm.BookAuthors.Add(new BookAuthorsVM
                {
                    BookName = book.BookName,
                    AuthorNames = book.Authors?.Select(a => a.AuthorName).ToList() ?? new List<string>()
                });
            }
        }
        
        resultList.Add(publisherVm);
    }
    return resultList;
}

注意事项

  • 如果你使用的是EF6,需要引入命名空间System.Data.Entity;如果是EF Core,需要引入命名空间Microsoft.EntityFrameworkCore才能正常使用Include方法
  • 更推荐使用预加载(Include)的方式加载关联数据,避免懒加载带来的N+1查询性能问题

内容的提问来源于stack exchange,提问作者AnthonyDob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:24:00