2010-06-20 1 views
5

나는 페이지에서 드롭 다운을 가지고이 드롭 다운에서 선택한 sord 순서에 따라 그리드를 보여주고 싶기 때문에 Column 변수로 정렬하는 방법 가격, 코드, 등급, 설명 등등과 나는 각 열에 대해 별도의 쿼리를 쓰고 싶지 않다.원하는 질문 Linq 쿼리에서 변수로 주문을 만드는 쿼리

from lm in lDc.tbl_Products 
where lm.TypeRef == pTypeId 
orderby lm.Code ascending 
select new; 
+0

항목 : http://stackoverflow.com/questions/41244/dynamic-linq-orderby 네하지만 내가이 문 경우 여러 작성해야 –

답변

6

SQL을 통해 정렬을 수행한다고 가정하면 정렬 열/유형을 전달해야합니다. 쿼리는이 단계에서 쿼리를 구축 할 수 있도록 당신이 실제로 선택을 할 때까지 연기하고 작업이 완료되면 지금처럼 실행됩니다 :

// Do you query first. This will NOT execute in SQL yet. 
var query = lDC.tbl_Products.Where(p => p.TypeRef == pTypeId); 

// Now add on the sort that you require... you could do ascending, descending, 
// different cols etc.. 
switch (sortColumn) 
{ 
    case "Price": 
     query = query.OrderBy(q => q.Price); 
     break; 
    case "Code": 
     query = query.OrderBy(q => q.Code); 
     break; 
    // etc... 
} 

// Now execute the query to get a result 
var result = query.ToList(); 

당신이 다음 단지 기본을 얻을 SQL 외부에서 작업을 수행하려면 정렬없이 결과를 가져온 다음 필요한 정렬 기준에 따라 OrderBy를 결과베이스에 적용합니다.

+0

에서 ordersData를 선언 할 수 있으며 쿼리에 일부 조인이 있으면 어떻게 할 수 있습니까 ?? – Azhar

+0

@Azhar는'Where' 다음에'Join'을 추가하기 만하면 모든 것이 똑같이 작동합니다. 'Join'은 또 다른'IQueryable'에 참여할 것입니다. – Kelsey

0

LINQ 쿼리를 별도의 단계로 "빌드"할 수 있습니다.

기본 쿼리를 생성하여 정렬되지 않은 정보를 반환하십시오. 이 쿼리는 결과를 시도하고 열거 할 때까지 실행되지 않습니다.

var data = from lm in lDc.tbl_Products 
      where lm.TypeRef == pTypeId 
      select new; 

그런 다음 이벤트 핸들러에서 결과를 모눈에 바인딩하기 전에 원하는 정렬을 적용하십시오.

var orderedData = from lm in data 
        order lm.Code ascending 
        select new; 

// TODO: Display orderedData in a grid. 

열거하는 전체 쿼리는 평가할 쿼리입니다. 즉, "기본"쿼리로 작성된 드롭 다운의 각 항목에 대해 별도의 쿼리를 실행할 수 있습니다.

+0

?? if 문 – Azhar

3
public static IEnumerable<T> OrderByIf<T,TKey>(this IEnumerable<T> source, bool condition, Func<T, TKey> keySelector) 
    { 
     return (condition) ? source.OrderBy(keySelector).AsEnumerable() : source; 
    } 

사용법 :

  var query = lDC.tbl_Products.Where(p => p.TypeRef == pTypeId) 
            .OrderByIf(sortColumn == "Price", p => p.Price) 
            .OrderByIf(sortColumn == "Code", p => p.Code);