C#中将实体列表转换为视图模型列表出现空值错误如何解决
解决方案
你遇到的空引用异常主要来自两个常见的编码疏漏,不需要强制改用foreach循环,两种写法都可以实现需求,只要做好关联数据加载和空值保护即可:
错误原因
- EF(Entity Framework)查询所有出版商时没有预加载关联的
Books导航属性,直接查询得到的Publisher对象中Books集合默认为null,映射时直接访问就会抛出空引用错误 - 映射逻辑没有对可能为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
相关产品推荐
相关产品推荐

