我有以下课程,
public class Sample
{
public int id { get; set;}
public string name { get; set;}
}
public class SampleViewModel
{
public int id { get; set;}
public string name { get; set;}
}
在数据访问层中我使用实体框架获取对象列表,如下所示
public class DAL
{
Dbcontext db = new Dbcontext();
public List<Sample> GetAll()
{
var sp = db.Samples.ToList();
return sp;
}
}
现在我正在尝试将该对象绑定到另一种类型的对象但具有相同的属性,而不使用如下的循环
public class BL
{
public List<SampleViewModel> GetAllSamples()
{
DAL data = new DAL();
var sam = data.GetAll();
List<SampleViewModel> viewdata = new List<SampleViewModel>();
viewdata = sam;
return viewdata;
}
}
但在这里我得到了以下错误
在此行viewdata = sam;
无法隐式转换类型
System.Collections.Generic.List<Sample>
来System.Collections.Generic.List<SampleViewModel>
正确的做法是什么
答案 0 :(得分:2)
您需要将Sample
类对象的属性映射到类型为SampleViewModel
的对象,对于编译器而言它们都是不同的类型,尽管它们具有相同的属性,您可以这样做:
List<SampleViewModel> viewdata = sam.Select(x=> new SampleViewModel
{
id = x.id,
name = x.name
}).ToList();
或者您可以使用像AutoMapper这样的库,一旦您在配置中定义类型之间的映射,就可以为您执行映射。
我们将映射初始化为:
Mapper.Initialize(cfg => cfg.CreateMap<Sample, SampleViewModel>());
然后在代码中,只要需要将对象转换为其他类型:
var sam = data.GetAll();
List<SampleViewModel> viewdata = mapper.Map<List<Sample>,List<SampleViewModel>>(sam);
答案 1 :(得分:0)
List<T>
与List<U>
不同意味着data.GetAll()
返回包含Sample
类型的项目的列表,但viewdata
是项目列表键入SampleViewModel
- 因此您获得了例外。
重写隐式运算符以从一个运算符转换为另一个运算符或使用.Select
将一个运算符投影到另一个运算符:
var viewdata = data.GetAll()
.Select(item => new SampleViewModel { id = item.id, name = item.name })
.ToList();