2013-07-08 2 views
0

최근 응용 프로그램에서 나는 Document 엔티티가 있으며이 문서는 사용자로부터 다른 사용자를 참조 할 수 있으며 각 사용자 그룹은 DocumentStation입니다. 이러한 DocumentStationHistory 표에 기록 참조합니다 enter image description here엔티티에 linq를 사용하여 그룹화

지금, 나는 모든 마지막 문서가 Dictionary-DocumentStationHistory 테이블에 LOGES이 (documentId에 의해 그룹) 최초의 EF 코드를 사용하는 것을 의미 나열합니다. 그래서 난이 방법을 썼다는 사전을 반환

public Dictionary<int, DocumentStationHistory> GetLastDocumentStationHistoryListOfDocuments(string criteria) 
{ 
     Dictionary<int, DocumentStationHistory> result = new Dictionary<int, DocumentStationHistory>(); 
     using (IUnitOfWork uow = new MyContext()) 
     { 
      DocumentStationHistoryRepository repository = new DocumentStationHistoryRepository(uow); 
      result = repository.All(). 
       Include(x => x.DocumentStation). 
       Where(criteria,new object[]{}). 
       OrderBy(d=>d.DocumentId). 
       OrderBy(d=>d.DocumentStationHistoryId). 
       GroupBy(g => (int)g.DocumentId). 
       ToDictionary(g => (int)g.Key, g => g.LastOrDefault()); 
      return result; 
     } 
} 

을하지만 결과가 정확하지, 그것은 마지막이 결과에서, 각 문서의 또한 DocumentStation 탐색 속성을 참조 반환하지 않습니다 null입니다. 내 실수는 어디 갔지? 순서에 대한

답변

2

두 가지 문제 :

  • 당신은 거의 확실하게 당신이하지 생각하지 않는, 두 번 OrderBy을 사용하고 있습니다. 당신은 일반적으로 OrderBy을 사용해야합니다. ThenBy
  • 저는 GroupBy이 나머지 시퀀스의 순서를 유지한다고 확신하지 않습니다. 당신은 내에서 그룹 를 주문한다 :

    result = service.All() .Include(x => x.DocumentStation) .Where(criteria, new object[]{}) .GroupBy(g => (int)g.DocumentId) .ToDictionary(g => (int)g.Key, g => g.OrderBy(d => d.DocumentId) .ThenBy(d => d.DocumentStationHistoryId) .Last()); 

(LastOrDefault를 사용할 필요가 없습니다를 - 적어도 하나 개의 원소로
있다, 그렇지 않으면 없을 것입니다 그룹.)

Last을 사용하는 대신 OrderByDescendingThenByDescending 다음에 First을 사용하는 것이 좋습니다.

DocumentStation 포함 부분에 대해 모르겠다.

+0

문제가 해결되어 그룹이 생성되었지만 탐색 속성이 아직 null입니다. – Masoud

+0

@Masoud : 별도의 질문으로 분리 할 가치가 있습니다. 가능한 경우 그룹화 부분을 제거하는 것이 이상적입니다. (* 그룹화하지 않으면 탐색 속성을 유지합니까?) –

+0

예, 그룹화하지 않으면 탐색 속성이 유지됩니다. – Masoud

관련 문제