2013-04-10 3 views
0

내 개체가 내보기에서 표 (표)를 구성하는 Linq 쿼리를 작성하고 있습니다.Linq 식의 변수 사용

filteredProducts = 
    filteredProducts.Take(take) 
        .Skip(pagesToSkip) 
        .OrderBy(w => w.ProductName) 
        .ToList(); 

매우 일반적인 패턴대로; 그리드는 어떤 열 머리글을 클릭했는지에 따라 다른 열을 'OrderBy'할 수 있습니다. 가능한 열 이름을 포함 할 수 있도록 하드 코드 된 'ProductName'을 대체해야합니다. solution is probably based on the approach presented at this question but하지만 내 유스 케이스는 아직 충분히 구현할 수 없었습니다. SO의 자동 제안은 분명히 공통적 인 문제이기 때문에 이상하게 보이는 다른 명확한 정보를 제공하지 않습니다.

var mySortColumn = "w.ProductId"; 

다음 :

나는 명백한 시도했습니다

.OrderBy(w => mySortColumn) 

및 중 지정된 값에 대한 컴파일 또는 런타임 불평하지만 존경을 얻을 수 없습니다. 필자가 시도한 다른 변형은 컴파일러 오류를 즉시 발생시킵니다.

This article suggests I should use a SWITCH/CASE construct 각 가능한 'OrderBy'절마다 완전히 다른 쿼리를 작성하십시오. 나는 일반적으로 해킹으로 코를 돌리지는 않지만, Ick.

동적 SQL 일의 '문자열 만들기'와는 거리가 먼 것처럼 보입니다.

+0

각 열에 대해 w => w.ProductName과 같은 식을 저장 한 다음 쿼리'OrderBy (productColumnExpression) '로 대체 할 수 있습니다. – Vladimir

답변

0

OrderBy 메서드는 Func<Type,int> 대리자를 사용합니다. 이것은 당신이 이런 식으로 뭔가 할 수 있다는 것을 의미합니다 : 당신이 정말로 속성 이름을 정렬 할 수있게하려면

using System; 
using System.Collections.Generic; 
using System.Linq; 
class Program 
{ 

    static void Main(string[] args) 
    { 
     var foos = new List<Foo>() 
     { 
      new Foo { A = 1, B = 2 }, 
      new Foo { A = 2, B = 1 } 
     }; 

     Func<Foo, int> a = f => f.A; 
     Func<Foo, int> b = f => f.B; 

     bool orderByA = false; 

     Display(foos.OrderBy(orderByA ? a : b)); 
    } 

    private static void Display(IEnumerable<Foo> foos) 
    { 
     foos.ToList().ForEach(f => Console.WriteLine(f)); 
    } 
} 

class Foo 
{ 
    public int A { get; set; } 
    public int B { get; set; } 

    public override string ToString() 
    { 
     return A + " " + B; 
    } 
} 

을, 당신은 당신의 string에서 Expression를 생성하는 코드를 작성해야합니다.