.Net Core中快速将DBContext实体数据绑定到ViewModel的方法
快捷实现实体类到ViewModel的转换方法
你的Products实体类和ProductsViewModel属性完全匹配,有以下几种无需逐个赋值的快捷实现方式:
1. LINQ查询时直接投影(性能最优推荐)
不用先查询出List<Products>再转换,直接在EF查询阶段就投影成ProductsViewModel,EF会自动生成仅包含所需字段的SQL(避免不必要的实体实例化):
List<ProductsViewModel> productViewModels = _context.Products .Where(x => x.IsActive == true) .Select(x => new ProductsViewModel { ProductId = x.ProductId, ProductName = x.ProductName, IsActive = x.IsActive }) .ToList();
如果属性名、类型完全一致,还可以简化对象初始化(EF Core 3.0+支持这种隐式投影):
List<ProductsViewModel> productViewModels = _context.Products .Where(x => x.IsActive == true) .Select(x => new ProductsViewModel()) .ToList();
2. 使用对象映射库(如AutoMapper)
适合有大量类似转换场景的情况,通过配置实现一键批量转换:
步骤1:安装NuGet包
Install-Package AutoMapper Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection
步骤2:配置映射规则
在项目的配置类(如Program.cs/Startup.cs)中注册AutoMapper并添加映射:
// .NET 6+ Program.cs示例 builder.Services.AddAutoMapper(typeof(Program)); // 创建映射配置文件 public class MappingProfile : Profile { public MappingProfile() { // 属性完全匹配时,无需额外配置 CreateMap<Products, ProductsViewModel>(); } }
步骤3:执行转换
在需要转换的类中注入IMapper,然后批量转换已有数据:
private readonly IMapper _mapper; // 构造函数注入 public YourService(IMapper mapper) { _mapper = mapper; } // 转换已获取的productData List<ProductsViewModel> productViewModels = _mapper.Map<List<ProductsViewModel>>(productData);
3. 手动扩展方法(无第三方依赖)
不想引入外部库的话,可以写静态扩展方法实现转换:
public static class ProductsExtensions { public static ProductsViewModel ToViewModel(this Products product) { return new ProductsViewModel { ProductId = product.ProductId, ProductName = product.ProductName, IsActive = product.IsActive }; } }
使用时直接调用扩展方法:
List<ProductsViewModel> productViewModels = productData.Select(p => p.ToViewModel()).ToList();
内容的提问来源于stack exchange,提问作者Soft_API_Dev
相关产品推荐
相关产品推荐

