2010-06-30 3 views
1

다음 linq 쿼리에 조금 갇혀 있습니다. "완료"이외의 상태 또는 지난 달 내에 완료된 모든 주문을 찾으려고합니다.Linq 람다 쿼리의 OR 논리에 대한 도움말

_ordersRepository.GetAllByFilter(
    o => o.OrderStatus 
     .OrderByDescending(os => os.StatusUpdate.Date) 
     .First() 

      // so at this point I have found the most recent status, 
      // and I need to do something like... 

      /* pseudo code */ 
      WHERE 
       StatusUpdate.StatusType.Name != "Completed" 
      OR 
       StatusUpdate.Date > DateTime.Today.AddMonths(-1) 
    ); 

편집는 명확히 : 나는 데 어려움 내가 Order.Status 같은 현재 상태를 얻을 수있는 직접적인 방법이 없다는 것입니다. 상태는 역사적으로 StatusUpdate 테이블에 보관됩니다. A StatusUpdateOrderStatus 링커 테이블 (하나의 주문에는 많은 StatusUpdate가 있음)으로 Order에 연결됩니다. 위 내 시도 코드를 보면, 당신은 내가 함께 현재 상태를 알아내는하고 볼 수 있도록 :

Order.OrderStatus.OrderByDescending(os => os.StatusUpdate.Date).First()

이것은 현재 주문 상태에 해당 나에게 StatusUpdate을 제공합니다. 지금 확인해야합니다

StatusUpdate.StatusType.Name == "Completed" // StatusType is like an enum lookup table 
OR 
StatusUpdate.Date > lastMonth 

내가 거의 얻을 수있는 방법 I 그것을 할 수 있지만 끔찍하게 비효율적 않고.

답변

1

이제 알았습니다. 그것은 내 앱에서하는 것처럼, 마지막 상태가 현재 상태 인 Statuses, Orders 및 "Movements"테이블이 있습니다. 예제를 업데이트합니다.

DateTime dateToMatch = DateTime.Today.AddMonths(-1); 
var orders = from c in Context.Orders 
let currentMovement == c.Movements.OrderByDescending(x => x.PerformedOn).FirstOrDefault() 
let currentStatusName == currentMovement.Status.Name 
where currentStatusName != "Completed" || (currentStatusName == "Completed" && currentMovement.PerformedOn > dateToMatch) 
select c; 
+0

예 내가 원하는 것, 감사합니다. 나는 "let"에 대해 몰랐다. 단 하나의 문제 : 내 저장소에 대한 내 GetAllByFilter 메서드는 람다 매개 변수를 사용합니다. 이 쿼리를 람다 구문으로 작성할 수 있습니까? – fearofawhackplanet