Я не могу напрямую привести объект в запрос Entity Framework с помощью ValueInjecter - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь использовать 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.

Спасибо за вашу помощь!

Edit:

@ Крис Пратт: Спасибо за ваш быстрый ответ. Но почему это работает, когда я сопоставляю свойства вручную, как в примере ниже. Я все еще применяю это сопоставление к интерфейсу IQueryable, а не в памяти.

Тогда почему это работает?

var vm = _context.Assets
                .Select(a => new ViewModel
                {
                    Id = a.Id,
                    Code = a.Code
                })
                .AsNoTracking()
                .ToList();

return vm;

1 Ответ

1 голос
/ 26 марта 2019

Я не использовал ValueInjector, но я предполагаю, что все сводится к тому, что Select применяется в памяти в первом примере и к запросу во втором примере.Динамическое отображение не является чем-то, что может быть сделано на уровне базы данных, и, в частности, EF должен уметь переводить вещи, которые вы передаете в Select, Where и т. Д., В SQL.Он не сможет сделать это с помощью кода ValueInjector и, следовательно, не сможет создать запрос для удовлетворения выражения LINQ.У вас нет этой проблемы в первом примере, потому что вы извлекаете сущности из базы данных сначала , а затем сопоставляете эти экземпляры в памяти.

Для чего стоит AutoMapperздесь такая же проблема, так что технически это не проблема поставщика картографирования - просто одна из тех, где будет выполняться операция (то есть в памяти или в базе данных).

...