2010-12-14 4 views
2

I로 시작하는 다음과 같은 쿼리가 :복잡한 ORDERBY

if (orderBy == ProductSortingEnum.Name) 
        query = query.OrderBy(x => x.Name); 
       else 
        query = query.OrderBy(............); 
: 나는 결과를 정렬 할 나는 그것을하고 결국 좀 더 필터링을 적용하고있어

var query = from p in db.Products 
         from pc in p.NpProductCategories 
         where pc.CategoryId == categoryId 
         select p; 

내 큰 문제 (linq를 잘 모르는 것에서 오는)가 여기에 있습니다. 현재 결과 집합에없는 열을 기준으로 결과를 정렬하려면 어떻게합니까? 나는 어떻게 든 orderby에서 다른 linq 쿼리에 연결하고 싶습니다. 내가 실현하려 노력하고있어 소팅은 당신이 당신의 Join 쿼리 한에 연결할 수 있습니다 내가 생각하는 NpProductVariant

+0

몇 단어 이상을 강조 표시 할 때 굵은 글꼴 대신 * 필기체 * 텍스트를 사용하십시오 :) – Roberto

답변

7

(하나 많은)

1-1를 들어

... 당신이 DBML에서 설정 한 관계를 가지고 가정 :

query = query.OrderBy(p => p.NpProductVariant.Price); 

하나 많은 :

query = query.OrderBy(p => p.NpProductVariants.Select(v => v.Price).Max()); 

기타

var query = 
    from p in db.Products 
    where p.NpProductCategories.Any(pc => pc.CategoryId == categoryId) 
    select p; 
+1

당신은 천재입니다! 네가 준 두 번째 변종이야. 고마워요! –

1

의 가격을 기준으로 정렬 NpProductVariant과 제품 사이에 과 일치하는 제품 ID를 사용하여 NpProductVariants 쿼리에 연결하는 것입니다 같은 것을 돌려주는 것처럼 그래서 어쩌면 같은 것을 (나는 그것을 시도하지 않았기 때문에 100 % 확실하지 않다) :

  query = from i1 in query 
       join i2 in query2 on i1.PropertyToJoin equals i2.PropertyToJoin 
       orderby i1.OrderProp1, i2.OrderProp2 
       select i1; 

하지만 여전히 유효하므로 생성 된 SQL을 확인하는 것이 좋습니다 것 같아요.

+0

문제는 약간 나중에 코드에서 수행합니다. query.Skip (index * pageSize) .Take (pageSize) .ToList(). 정렬 된 열거 형이 필요합니다. 이 쿼리에서 예외가 발생하는 경우 : 'Skip'메서드는 LINQ to Entities의 정렬 된 입력에 대해서만 지원됩니다. 메소드 'OrderBy'는 메소드 'Skip'보다 먼저 호출되어야합니다. –

+0

왜 그런가요? 우리가 다시 추적하자. 첫 번째 주문 만 가지고 있다면 제대로 작동 할까? 그렇다면 결과 쿼리가 동일한 반환 유형을 가진 한 두 번째 쿼리에서 작동해야합니다. –