将IEnumerable <x>转换为IEnumerable <y> </y> </x>

时间:2013-10-04 09:58:47

标签: c# asp.net-mvc-4 mapping

IEnumerable<ContactPerson> results = _contactPersonRepository.GetContactPersons().Where(x => x.UserId == user.UserId);
IEnumerable<ContactPersonViewModel> contactPersons = results...

我该怎么做?我有IEnumerable<X>,然后我想在IEnumerable<Y>转换它。

有没有办法做到这一点?

此致

5 个答案:

答案 0 :(得分:4)

使用Select(如果您希望项目Y为新的X类型)或Cast(如果Y是从X继承的)IEnumerable<T>的扩展名:

IEnumerable<ContactPersonViewModel> contactPersons = 
    results.Select(p => CreateContactPersonViewModelFrom(p));

如果ContactPersonViewModel是ContactPerson:

IEnumerable<ContactPersonViewModel> contactPersons = 
    results.Cast<ContactPersonViewModel>();

通常创建视图模型涉及从实体到视图模型的手动属性映射。像这样:

IEnumerable<ContactPersonViewModel> contactPersons = 
    results.Select(p => new ContactPersonViewModel {
                       Name = p.Name,
                       Phone = p.Phone
                   });

所以我建议你看一下像Automapper这样的映射框架。它为你做了很多映射。这段代码看起来像:

IEnumerable<ContactPersonViewModel> contactPersons = 
    Mapper.Map<IEnumerable<ContactPersonViewModel>>(results);

答案 1 :(得分:1)

当然,Enumerable.Select

var contactPersons = results.Select(r => new ContactPersonViewModel(r));

这假设有一个ContactPersonViewModel构造函数需要ContactPerson;如果没有,您将不得不提供另一种初始化视图模型的方法。

答案 2 :(得分:1)

尝试施放它。

 IEnumerable<ContactPerson> results = _contactPersonRepository.GetContactPersons().Where(x => x.UserId == user.UserId);

 IEnumerable<ContactPersonViewModel> contactPersons = results.Cast<ContactPersonViewModel>();

答案 3 :(得分:0)

这样做的一种方法是Select方法:

IEnumerable<ContactPersonViewModel> contactPersons = results.Select(x => new ContactPersonViewModel 
{
   Id = x.Id
   //...
});

答案 4 :(得分:0)

这可能会有所帮助(您可以使用Select方法):

  IEnumerable<ContactPersonViewModel> contactPersons = 
      results.Select(i=>new ContactPersonViewModel(){/*set your parameters */});

不要忘记添加using System.Linq;