2012-05-22 30 views
14

Powiel możliwe:
Dynamic LINQ OrderByprzełącznik Unikać przypadek -linq

switch (sort) { 
       case "Title": 
        queryResults = queryResults.OrderBy(r => r.Title); 
        break; 
       default: 
        queryResults = queryResults.OrderBy(r => r.LastName); 
        break; 

jest jakiś sposób mogę pozbyć się bloku switch powyżej?

mogę zrobić kilka rzeczy, takich jak:

queryResults = queryResults.OrderBy(r => r."sort"); 
or 
queryResults = queryResults.OrderBy(r => r.sort); 
+0

Znajdziesz odpowiedź na to pytanie: http://stackoverflow.com/questions/41244/dynamic-linq -orderby –

+0

Dostarczone rozwiązania nie będą działać dla większości dostawców linq, zobacz moje rozwiązanie: http://stackoverflow.com/a/21936366/775114 –

Odpowiedz

8

Jeśli chcesz to zrobić całkowicie dynamiczny, można korzystać z niektórych refleksji (prosty przykład):

string prop = "Title"; 
var q = queryResults.OrderBy(x => x.GetType().GetProperty(prop).GetValue(x, null)); 

nie uważam tego najprzyjemniejsze rozwiązanie jednak w każdym przypadku. To, czy ma to dla ciebie sens, zależy od tego, skąd otrzymujesz nazwę nieruchomości (jeśli ją otrzymujesz od refleksji, czy nie) i ile jest jej właściwości.

5

ten powinien zrobić to

queryResults = queryResults.OrderBy(r => sort == "Title" ? r.Title : r.LastName) 
4

Można użyć DynamcLinq. Nie dotykałem tego od ponad roku, ale miałem spodziewane rezultaty. Twój kod będzie zmienić na:

queryResults = queryResults.OrderBy(sort);

Oh cool, jest to również NuGet package too