2011-11-04 2 views
1

다른 테이블의 일부 값 (조인을 통해)으로 주 테이블을 주문 (계약) 한 다음 다시 계약으로 축소하고 계약의 값으로 정렬 (ThenBy)하려고합니다.ThenBy가 실패한 후 선택

여기에 내 질문의 짧은 버전입니다 :
는 그것은 된 IQueryable로 내 IOrderedQueryable을 끄지 않고 정의 유형 (조인에 의해 생산) 복합 익명 형식을 줄일 수 있습니까?

예와 질문의
긴 버전 :

내 생산 코드는 매우 복잡하지만 간단한 예제로 세분화 한이 질문의 목적을 위해 :

static void simple() 
{ 
    bool condition = true; 

    var ctx = new LxDataContext(); 

    IQueryable<Contract> q1 = ctx.Contracts.Join(ctx.ContractDetails, c => c.ContractId, cd => cd.ContractId, (c, cd) => new { c, cd }). 
          Where(J => J.cd.DetailNo > 0). 
          Select(J => J.c); 

    IOrderedQueryable<Contract> qOrdered; 

    if (condition) 
    { 
    qOrdered = (IOrderedQueryable<Contract>)q1.Join(ctx.ContractPartners, c => c.ContractId, cp => cp.ContractId, (c, cp) => new { c, cp }). 
       Join(ctx.VwPartners, J => J.cp.PartnerId, p => p.PartnerId, (J, p) => new { J.c, p }). 
       OrderBy(J => J.p.LastName). 
       Select(J => J.c); 
    } 
    else 
    qOrdered = q1.OrderBy(c => c.Premium); 

    IOrderedQueryable<Contract> qReady = (qOrdered).ThenBy(c => c.ContractId); //if condition == true exception here 

    var dump = qReady.Skip(50).Take(50).ToList(); 
} 

조건이 거짓이면 모든 것이 예외로 작동합니다. 더 복잡한있는 OrderBy는())를 ThenBy을 (실행이 예외와 함께 실패 그러나 때

Expression of type 'System.Linq.IQueryable`1[InfoServiceTests.DB.Contract]' cannot be used for parameter of type 'System.Linq.IOrderedQueryable`1[InfoServiceTests.DB.Contract]' of method 'System.Linq.IOrderedQueryable`1[InfoServiceTests.DB.Contract] ThenBy[Contract,Int32](System.Linq.IOrderedQueryable`1[InfoServiceTests.DB.Contract], System.Linq.Expressions.Expression`1[System.Func`2[InfoServiceTests.DB.Contract,System.Int32]])' 

내가 IOrderedQueryable <에 캐스팅 그래서 비록> qOrdered은 (< IOrderedQueryable>과 ThenBy 될 것 같지 않습니다) 실패합니다. 다른 테이블의 내용으로 정렬 한 다음 결과를 계약으로 줄이고 다시 정렬 할 수 있습니까?


일부 의견 :
는 - 그것은 당신에게 어떤 도움이 있다면 내 생산 코드에서 나는 일반적인 분류 클래스는 대부분 this answer에서 가져온 있습니다.
예 예를 쉽게 고칠 수는 있지만 프로덕션 코드에는 사용자 정의 값별로 정렬하기위한 일반적인 솔루션이 필요합니다. 이는 루핑을 호출하고 Queryables를 함수로 전달합니다.

상태가 확인되면 이후 쿼리를 선택 becausae 당신이 어떤 주문을 추가해야

답변

0

쿼리를 주문하지 않고 ThenBy은 후 주문 쿼리를 작동합니다

는 오름차순 시퀀스의 요소 후속 정렬합니다 . 당신의 진정한 조건 (귀하의 경우 상태) 당신이 할 수있는 예를 들면

:

qOrdered = (IOrderedQueryable<Contract>)q1 
      .Join(ctx.ContractPartners, 
      c => c.ContractId, cp => cp.ContractId, (c, cp) => new { c, cp }). 
      Join(ctx.VwPartners, J => J.cp.PartnerId, 
       p => p.PartnerId, (J, p) => new { J.c, p }). 
       OrderBy(J => J.p.LastName).ThenBy(J=>J.ContractId) 
       Select(J => J.c); 

당신은 (당신의 else 문에서) 수행 할 수 있습니다 또한

qOrdered = q1.OrderBy(c => c.Premium).ThenBy(c=>c.ContractId); 

당신이해야 if 문 다음에 현재 ThenBy 조작을 제거하십시오.

실제로 주문 가능한 항목을 찾고 OrderBy를 누른 다음 ThenBy를 사용해야합니다.

+0

생각해 보았지만 Jc는 계약을 의미하기 때문에'OrderBy (J => Jc)'는 작동하지 않습니다. 비교 자없는 클래스입니다.또 다른 OrderBy를 사용하면 이전의 모든 OrderBy가 무효화됩니다. – void

+0

@NULL 나는 당신의 방식으로 주문했습니다. –

+0

내 예제에서 문제를 고쳤습니다. 불행히도 내 실제 코드에서 반 정렬 된 쿼리를 전달하여 정렬/필터를 추가로 수행하고, 다른 테이블과 조인하고, 페이징 데이터를 준비하는 등의 작업을 수행했습니다. – void

0
는 경우에 코드를 변경

:

qOrdered = (IOrderedQueryable<Contract>)q1.Join(ctx.ContractPartners, c => c.ContractId, cp => cp.ContractId, (c, cp) => new { c, cp }). 
       Join(ctx.VwPartners, J => J.cp.PartnerId, p => p.PartnerId, (J, p) => new { J.c, p }). 
       Select(J => J.c). 
       OrderBy(J => J.p.LastName) 

이는 IOrderedQueryable를 반환합니다. Select가 End를 추가하면 ThenBy로 주문할 수없는 일반 IQueryable을 얻을 수 있습니다.

+0

선택 J.p가 더 이상 사용할 수없는 후에, 나는 그것을 선택에 포함시킬 수 있었지만 나는 시작했다. – void

관련 문제