주문

2013-04-16 5 views
1

나는 몇 가지 조합을 시도했지만 난 그냥 다음을 수행하는 방법을 이해하지 않습니다주문

내가 및 RequestActivities을 요청 테이블이 있다고 가정하자를 . 모든 요청을 RequestActivity.TimeOfCreation 순으로 내림차순으로 정렬해야하지만 RequestActivity은 null 일 수 있습니다. 내가 LINQ - 투 - SQL 정말 익숙하지 않아요하지만이 경우 MAX 작동하지 않습니다

 List<DA.GeneralRequest> ongoingGeneralRequests = db.GeneralRequests 
      .Where(t => t.GeneralRequestStatusID != 3 && (t.SupervisorID == currentUserId || t.CreatorID == currentUserId || t.AssignedUsers.Any(au => au.UserID == currentUserId))) 
      .OrderByDescending(x => x.GeneralRequestActivities.OrderBy(ga => ga.GeneralRequestActivityDate).Last().GeneralRequestActivityDate) //gives exeption 
      .ThenBy(a => a.Deadline).ToList(); 
+0

아니요, ** x.GeneralRequestActivities **는 비어있을 수 있습니다. –

답변

3

?

.OrderByDescending(x => x.GeneralRequestActivities 
         .Max(ga => ga.GeneralRequestActivityDate)) 
.ThenBy(a => a.Deadline) 
.ToList(); 
+0

예, 어떤 이유로 Max가 예외도 있지만. First() 또는 Last()가 아닌 이유는 모르겠습니까? –

+0

@DusanVasiljevic : 예, 'First'와'Last'는 시퀀스가 ​​비어 있으면 예외를 던집니다. 그러므로'FirstOrDefault' 또는'LastOrDefault'를 사용해야합니다. Linq - 투 - SQL에서 작동하는 경우 그러나, 나는하지 않습니다. "맥스"는 더 나은 선택입니다. –

+0

'FirstOrDefault'와'LastOrDefault'도 예외를 제공하고있었습니다. 고맙습니다. –

1
는 일부 기본 날짜별로 다른, null가 아닌 경우, 먼저 날짜가 다음 순서 값과 순서를 캐시 할 필요가

당신이 원하는 :

List<DA.GeneralRequest> ongoingGeneralRequests = db.GeneralRequests 
     .Where(t => t.GeneralRequestStatusID != 3 && (t.SupervisorID == currentUserId || t.CreatorID == currentUserId || t.AssignedUsers.Any(au => au.UserID == currentUserId))) 
     .Select(x => new { 
        Value = x, 
        OrderByValue = x.GeneralRequestActivities 
          .OrderBy(ga => ga.GeneralRequestActivityDate) 
          .LastOrDefault()) // cache value 
     .OrderByDescending(x => x.OrderByValue != null ? 
            OrderByValue.GeneralRequestActivityDate 
           : some default value) 
     .ThenBy(a => a.Value.Deadline) 
     .Select(a => a.Value) 
     .ToList(); 

주 사용하지 수 Last() 비어있는 IEnumerable의 확장 메소드. 따라서 예외가 발생하는 이유는 다음과 같습니다.

InvalidOperationException : 소스 시퀀스가 ​​비어 있습니다. 이 라인에서

:

x.GeneralRequestActivities.OrderBy(ga => ga.GeneralRequestActivityDate).Last() 

x.GeneralRequestActivities는 예외에 결과에 너무 Last()를 호출 비어 있습니다.

대신 LastOrDefault() 확장 메서드를 사용하면 IEnumerable이 비어있는 경우 null을 반환합니다.

반환 값 형식 : 소스 시퀀스가 ​​ 인 경우 TSource 기본값 (TSource); 그렇지 않으면 IEnumerable의 마지막 요소입니다.