2012-10-02 1 views
2

이전 메인 프레임 시스템의 알파벳순 논리를 복제해야하는 응용 프로그램을 다시 작성하고 있습니다. 이전 메인 프레임 시스템에서 항목 변경 레코드 ID는 A부터 Z까지 알파벳 순으로 정렬 된 다음 AA, AB 등으로 시작됩니다. 불행히도 SQL Server와 .NET은 모두 A와 B 사이에 AA를 넣으 려하므로 어떤 농구를 뛰어 넘을 필요가 있습니다. 길이를 내림차순으로 정렬 한 다음 내림차순으로 정렬하여 변경 ID를 정렬하려고합니다. 변경 한Entity Framework에서 내 주문 항목을 무시하는 이유는 무엇입니까?

protected internal IList<TeamViewModel> GetTeams(string recordId, string changeId) 
{ 
    var viewModels = (from x in repository.Teams 
       where x.RecordId == recordId && x.ChangeId.Length <= changeId.Length && 
       (x.ChangeId.CompareTo(changeId) == -1 || x.ChangeId.CompareTo(changeId) == 0) 
       orderby x.ChangeId.Length descending, x.ChangeId descending, x.ChangeId descending 
       group x by x.TeamId into grp 
       select grp.FirstOrDefault()) 
       .ToList() 
       .Select(TeamViewModel.FromEntity) 
       .ToList(); 

      return viewModels; 
} 

각 "레코드는"변경 기록의 컬렉션을 가지고 있으며, 각 변경 기록 ChangeId 속성과 및 TeamId : 여기

내가 데이터를 검색하는 데 사용하고있는 방법이다. 나는 각각의 고유 한 팀 ID에 대한 "최신"(이전 메인 프레임 정렬 논리에 따라) 변경 기록을 얻으려고합니다. 다시 말해서, 나는 레코드를 주문하고 팀으로 그룹화 한 다음 각 그룹에서 첫 번째 레코드를 가져 오려고합니다.

repository.Teams 속성은 내 ObjectContext에 선언 된 ObjectSet을 래핑하는 IQueryable을 반환합니다.

Linqpad (기본 구성 사용)에서 실행할 때이 쿼리가 올바르게 작동한다는 것은 무엇보다 내 저장소의 모의 작업을이 클래스에 주입하면 단위 테스트 내에서이 바로 메서드가 정상적으로 실행됩니다. , 나는 SQL 데이터베이스에있는 것과 똑같은 데이터를 방출하도록 설정했습니다.

그러나이 방법을 런타임에 실행하면 마치 orderbys가있는 행이 완전히 생략 된 것처럼 동작하고 실제로 Linqpad 주석이있는 동일한 결과 (기본 구성 사용)를 제공합니다. 주문 목록. SQL 프로파일 러는 생성 된 SQL이 사람이 해독하기가 거의 불가능하지만 어디에도 "주문"이라는 단어가 포함되어 있지 않음을 보여줍니다.

마지막주의 사항으로, 프로젝트의 어셈블리 내에서 EF 생성 된 형식화 된 데이터 집합을 사용하도록 Linqpad를 구성하면 런타임에 볼 때와 동일한 결과가 표시되며 결과는 순서대로 무시됩니다.

실제 결과를 표시 할 수는 있지만 데이터는 독점적이므로 Linqpad 및 유닛 테스트에서 제공 한 올바른 결과에는 "Y"및 "Z"와 같은 ID가있는 변경 레코드가 포함되어 있습니다. 런타임에 내 프로젝트에서 볼 수있는 설명 할 수없는 결과는 "A"및 "B"와 같습니다.

누구나 여기서 일어나는 일을 볼 수 있으며, 내가 중요하게 생각하는대로이 기능을 만들기 위해 무엇을 바꾸어야합니까?

내 프로젝트에서 엔티티 프레임 워크 5.0을 사용 중이고 Linqpad 4.42.01을 사용하고 있습니다.

감사합니다.

답변

4

Group by는 원래 주문을 유지한다고 보장하지 않습니다. 주문을 원할 경우 그룹을 통해 주문해야합니다.

사실 그룹 별 순서에 따라 순서를 변경하는 것은 의미가 없습니다. 단 하나의 그룹이 아니라면 그룹 별 순서가 변경 될 수 있기 때문입니다.

+0

각 그룹에서 .FirstOrDefault()를 가져올 때 정확한 레코드가 반환되도록 그룹화하기 전에 또는 그룹 내에서의 순서가 중요했습니다. .FirstOrDefault()를 잡은 후 주문하면 필요한 레코드가 아닌 레코드를 정렬합니다. 어떤 아이디어가 이것을 해결하는 방법? –

+0

잘 보관 해 두 경우 모두 주문해야 할 수도 있습니다. –

+0

저는 여전히 구문에 조금 어려움을 겪고 있으며 표현식과 확장 구문을 결정하려고 노력하고 있습니다. 그러나 당신은 제가 앞으로 나아갈 길이 멀었을 때부터 저를 도왔습니다. 좋은 도움을 가져 주셔서 감사합니다. 다른 사람에게 유용 할 것 같은 코드 스 니펫으로 마무리하면 게시 할 것입니다. –

0

나는 추측을 만들거야 ...

귀하의 ChangeId 년대는 모두 같은 길이입니다. 데이터베이스는 VARCHAR 대신 CHAR (10) 열 또는 다른 것으로 매핑되므로 A는 실제로 "A"이고 AB는 실제로 "AB"입니다. 오프셋이있는 메인 프레임과 COBOL 및 플랫 파일이 내 이유입니다.이 경우 길이를 가져 오기 전에 먼저 ChangeId를 트림()해야합니다.

관련 문제