다른 테이블의 일부 값 (조인을 통해)으로 주 테이블을 주문 (계약) 한 다음 다시 계약으로 축소하고 계약의 값으로 정렬 (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를 함수로 전달합니다.
생각해 보았지만 Jc는 계약을 의미하기 때문에'OrderBy (J => Jc)'는 작동하지 않습니다. 비교 자없는 클래스입니다.또 다른 OrderBy를 사용하면 이전의 모든 OrderBy가 무효화됩니다. – void
@NULL 나는 당신의 방식으로 주문했습니다. –
내 예제에서 문제를 고쳤습니다. 불행히도 내 실제 코드에서 반 정렬 된 쿼리를 전달하여 정렬/필터를 추가로 수행하고, 다른 테이블과 조인하고, 페이징 데이터를 준비하는 등의 작업을 수행했습니다. – void