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

我怎样才能做到这一点?我有IEnumerable<X>,然后我想将其转换为IEnumerable<Y>.

有没有办法做到这一点?

问候

4

5 回答 5

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);
于 2013-10-04T10:00:16.337 回答
1

当然,Enumerable.Select

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

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

于 2013-10-04T10:00:33.430 回答
1

尝试投射它。

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

 IEnumerable<ContactPersonViewModel> contactPersons = results.Cast<ContactPersonViewModel>();
于 2013-10-04T10:04:39.233 回答
0

一种方法是Select方法:

IEnumerable<ContactPersonViewModel> contactPersons = results.Select(x => new ContactPersonViewModel 
{
   Id = x.Id
   //...
});
于 2013-10-04T10:00:36.893 回答
0

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

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

不要忘记添加using System.Linq;

于 2013-10-04T10:00:54.070 回答