Я не могу напрямую привести объект в свой запрос Entity Framework, используя ValueInjecter

#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 здесь была бы та же проблема, так что технически это не проблема поставщика сопоставления — просто одна из тех, где будет выполняться операция (т. Е. в памяти или в базе данных).