2016-08-04 6 views
0

Automapper와 Queryable Extensions를 사용하여 일부 유사한 모델을 동일한 DTO에 투영하여 Entity Framework를 통해 DB 서버에서 페이징 할 때까지 데이터를 리턴하지 않고이를 병합하고 정렬합니다.Automapper가 특정 순서로 속성을 초기화하도록 강제 적용 할 수 있습니까?

 var tasksType1 = context.TasksType1.Project().To<MyDto>(); 
     var tasksType2 = context.TasksType2.Project().To<MyDto>(); 
     var allTasks = tasksType1.Concat(tasksType2); 
     return allTasks.ToMyPagedList() 

이는 지금 내 모델은 약간 더 복잡한 가지고, Automapper는 약간 다른 순서로 오류가 발생 할 때마다 투사를 초기화하는 것을 제외하고 잘 작동 :

The type 'AngularJSAuthentication.API.Dtos.ActivityDashboard.ActivityDashboardDto2' appears in two structurally incompatible initializations within a single LINQ to Entities query. 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.

이 거기를 Automapper가 제어 방식으로 영사를 초기화하도록 강제하는 어떤 방법? 나는 이미 두 가지 유형 모두에 대해 .ForMember와 .MapFrom을 사용하여 모든 속성을 정의하는지도를 설정했다.하지만 두 가지 유형 모두에 대해 정확히 동일한 순서로 매핑했지만 설정되지 않은 것처럼 보이고 작성된 SQL을 보면 보이지 않는다. 초기 모델의 재산 질서와 관련이있다.

감사의 말씀을드립니다.

+0

[this] (https://github.com/AutoMapper/AutoMapper/issues/790) 및 [this] (http://stackoverflow.com/questions/22810555/merging-two-iqueryables-that- 투영 원 - 엔티티 - 다른 엔티티 - 테이블에서)? –

+0

그 첫 번째 링크는 매우 흥미 롭습니다. 스티브 감사합니다! –

답변

0

나는 다음이 예측을 적용, 함께 두 CONCAT이 쿼리를 수정할 것 :

var tasksType1 = context.TasksType1; 
    var tasksType2 = context.TasksType2; 
    var allTasks = tasksType1.Concat(tasksType2); 
    return allTasks.ProjectTo<MyDto>().ToMyPagedList() 

LINQ 공급자 가능성이 후 돌출부를 연결 한의 복잡성을 처리 할 수 ​​있지만, 할 수도 있습니다 반대로 처리 할 수 ​​있습니다.

일반적으로 AutoMapper를 사용하여 나는 프로젝션을 프로세스의 마지막 단계로 삼 으려합니다.

+0

불행하게도 두 가지 유형의 작업 구조가 서로 다르기 때문에 초기 DTO 유형을 가져와 결합 할 수 있도록 초기 예상이 필요했습니다. LINQ가 매우 잘 처리되는 것처럼 보이도록 수동 투영을 작성하고 모든 정렬 및 페이징이 DB에서 올바르게 처리됩니다. 마침내 내가 한 일에 대해 http://stackoverflow.com/questions/33565435/automapper-projection-and-union/38773170#38773170을 참조하십시오. –

관련 문제