Могу ли я заставить Automapper инициализировать свойства в определенном порядке?
Я использую Automapper и Queryable Extensions для проецирования некоторых (похожих) моделей в один и тот же DTO, чтобы объединить и отсортировать их для подкачки на сервере БД (через Entity Framework) без возврата данных до тех пор, пока они не будут выгружены.
var tasksType1 = context.TasksType1.Project().To<MyDto>();
var tasksType2 = context.TasksType2.Project().To<MyDto>();
var allTasks = tasksType1.Concat(tasksType2);
return allTasks.ToMyPagedList()
Это работает хорошо, за исключением того, что теперь мои модели стали немного более сложными, кажется, что Automapper каждый раз инициализирует проекцию в несколько ином порядке, что приводит к ошибке:
Тип 'AngularJSAuthentication.API.Dtos.ActivityDashboard.ActivityDashboardDto2' появляется в двух структурно несовместимых инициализациях в одном запросе LINQ to Entities. A type can be initialized in two places in the same query, but only if the same properties are set in both places and those properties are set in the same order.
Is there any way of forcing Automapper to initialise the projection in a controllable manner? I have already set up the maps to define every property using.ForMember and.MapFrom in exactly the same order for both types but even that doesn't seem to do it, and looking at the SQL which is created, it doesn't seem to have anything to do with the property order in the initial model either.
Any suggestions gratefully received!
1 ответ
Я бы изменил этот запрос, чтобы связать их вместе, а затем применил бы прогнозы:
var tasksType1 = context.TasksType1;
var tasksType2 = context.TasksType2;
var allTasks = tasksType1.Concat(tasksType2);
return allTasks.ProjectTo<MyDto>().ToMyPagedList()
Поставщик LINQ, скорее всего, не может справиться со сложностью проекции, а не конкатенации, но может справиться с обратным.
В общем, с AutoMapper я стараюсь, чтобы проекция была самым последним шагом в этом процессе.