我有一个模型类,如下所示:
public class ProductsViewModel
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public bool IsActive{ get; set; }
}
下面是实体:
[Table("Products")]
public partial class Products
{
[Column("ProductId")]
public int ProductId { get; set; }
[Column("ProductName")]
public string ProductName{ get; set; }
[Column("IsActive")]
public bool IsActive { get; set; }
}
我使用下面的LINQ查询获取结果,它返回正确的数据:
List<Products> productData = _context.Products
.Where(x => x.IsActive == true).ToList();
现在,我想将这个数据,即productData
与我的模型绑定,类似于ProductsViewModel = productData
。
我知道我可以循环使用productData
记录并为模型属性赋值,但我正在寻找一种直接的方法来映射这两者。
有没有什么快速的wat可以把所有的productData
分配给我的模型?
是否有任何快速的wat来获取分配给我的模型的所有
productData
有几个。您可以使用Automapper,如另一个答案中所述,也可以使用Automapper。对于更复杂的映射,您可以为所需的任何奇异映射配置Automapper配置文件。
对于使用=
的直接赋值,就像你在问题中举例说明的那样,我认为对于不太复杂的实体来说,这可能是一种更简单的方法,你可以通过重载ProductsViewModel
类中的赋值运算符来实现:
public class ProductsViewModel
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public bool IsActive { get; set; }
public static implicit operator ProductsViewModel(Products obj)
{
return new ProductsViewModel()
{
ProductName = obj.ProductName,
IsActive = obj.IsActive,
ProductId = obj.ProductId,
};
}
}
现在你的直接任务就可以了。
例如,使用Select
和强制转换也是可能的,因为运算符重载:
var productsViewModels = _context.Products.Where(x => x.IsActive)
.Select(x => (ProductsViewModel)x).ToList();
或显式直接分配:
var productsViewModels = _context.Products.Where(p => p.IsActive)
.Select(x => { ProductsViewModel model = x; return model; }).ToList();
这里有一些运行代码,为了方便您可以查阅。
您可以使用映射框架,我使用最多的是Automapperhttps://docs.automapper.org/en/stable/Getting-started.html.
public class AClass {
private readonly IMapper _mapper;
private readonly ADbContext _dbContext;
public AClass (IMapper mapper, ADBContext dbContext)
{
_mapper = mapper;
_dbContext = dbContext;
}
public async Task<IEnumerable<ProductViewModel>> AMethod()
{
var dbProducts = await _dbContext.Products.Where(x => x.IsActive == true).ToListAsync();
return dbProducts.Select(x => _mapper.Map<ProductViewModel>(x))
}
}