У меня есть следующие классы,
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>
Какой правильный способ сделать это
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();
Вам необходимо сопоставить свойства объекта класса 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);
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.