У меня есть следующие классы,

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;}

}

И в слое доступа к данным я получаю список объектов, используя Entity Framework следующим образом

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>

Какой правильный способ сделать это

1
kez 24 Апр 2017 в 19:35

2 ответа

Лучший ответ

List<T> не совпадает с List<U>, то есть data.GetAll() возвращает список с элементами типа Sample, но viewdata является списком элементов типа {{ X5}} - поэтому вы получаете исключение.

Переопределите неявный оператор для преобразования из одного в другой или используйте .Select для проецирования одного в другой:

var viewdata = data.GetAll()
                   .Select(item => new SampleViewModel { id = item.id, name = item.name })
                   .ToList();
0
Gilad Green 24 Апр 2017 в 16:37

Вам необходимо сопоставить свойства объекта класса 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);
2
Ehsan Sajjad 24 Апр 2017 в 16:43
43593476