#casting #asp.net-core-mvc #valueinjecter
#Кастинг #asp.net-core-mvc #valueinjecter
Вопрос:
Я пытаюсь использовать ValueInjecter для сопоставления моих объектов с моими DTO в моем asp.net основной проект.
Кто-нибудь может объяснить мне, почему это работает:
var list = _context.Assets
.ToList();
var vm = list
.Select(a => new ViewModel().InjectFrom(a))
.Cast<ViewModel>()
.ToList();
return vm;
Но это не:
var list = _context.Assets
.Select(a => new ViewModel().InjectFrom(a))
.Cast<ViewModel>()
.ToList();
return list;
Это ошибка ValueInjecter? Я делаю что-то не так?
Решит ли это Automapper? Я настоятельно предпочитаю синтаксис valueinjecter по сравнению с Automapper.
Спасибо за вашу помощь!
Редактировать:
@Крис Пратт: Спасибо за ваш быстрый ответ. Но почему это должно работать, когда я сопоставляю свойства вручную, как в примере ниже. Я все еще применяю это сопоставление к интерфейсу IQueryable, не находящемуся в памяти.
Тогда почему это работает?
var vm = _context.Assets
.Select(a => new ViewModel
{
Id = a.Id,
Code = a.Code
})
.AsNoTracking()
.ToList();
return vm;
Комментарии:
1. EF пытается преобразовать linq в код SQL (как уже сказал @ Chrispr), и в SQL нет InjectFrom
Ответ №1:
Я не использовал ValueInjector, но я предполагаю, что это сводится к Select
применению в памяти в первом примере и к запросу во втором примере. Динамическое сопоставление — это не то, что можно выполнить на уровне базы данных, и, в частности, EF должен быть способен переводить то, что вы передаете в Select
, Where
и т.д., В SQL. Он не сможет сделать это с помощью кода ValueInjector и, следовательно, не сможет создать запрос, удовлетворяющий выражению LINQ. В первом примере у вас нет этой проблемы, потому что вы сначала извлекаете объекты из базы данных, а затем сопоставляете эти экземпляры в памяти.
Как бы то ни было, у AutoMapper здесь была бы та же проблема, так что технически это не проблема поставщика сопоставления — просто одна из тех, где будет выполняться операция (т. Е. в памяти или в базе данных).