2007-12-25

Programmatisch OrderBy oder OrderByDescending bestimmen

Jan Welker hat mich angefragt, wie er programmatisch die Sortierung innerhalb einer LINQ-Abfrage bestimmen kann.

In dem folgenden Beispiel wird gezeigt, wie Sie die Sortierung in einer LINQ-Abfrage programmatisch bestimmen können.

using System;
using System.Linq;
using System.Linq.Expressions;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string orderByDirection = "asc";

var source
= new DataClasses1DataContext().CountryRegions;
IQueryable query
= source.AsQueryable();

Expression
<Func<CountryRegion, string>> lambda = x => x.CountryRegionCode;
LambdaExpression expression
= lambda;

Type[] typeArgs
= new Type[] { query.ElementType, expression.Body.Type };

var mc
= Expression.Call(typeof(Queryable), orderByDirection == "asc" ? "OrderBy" : "OrderByDescending", typeArgs, query.Expression, expression);

IQueryable orderedQuery
= query.Provider.CreateQuery(mc);
}
}
}

Die Variable orderByDirection bestimmt in diesem Fall die Sortierreihenfolge. Mit dem Wert „asc“ wird das Resultat aufsteigend sortiert. Wenn der Wert anders als „asc“ ist, wird die Sortierung absteigend sein.


string orderByDirection = "asc";



Als Datenquelle wird die Datenbanktabelle CountryRegion der AdventureWorks-Datenbank verwendet.


var source = new DataClasses1DataContext().CountryRegions;


IQueryable query = source.AsQueryable();



Mit folgender Zeile definieren wir, welches Feld für die Sortierung verwendet werden soll. Das Feld CountryRegionCode wird in diesem Fall unser Sortierungsfeld sein.


Expression<Func<CountryRegion, string>> lambda = x => x.CountryRegionCode;



Im folgenden definieren wir einen MethodCallExpression.


var mc = Expression.Call(typeof(Queryable), orderByDirection == "asc" ? "OrderBy" : "OrderByDescending", typeArgs, query.Expression, expression);



Mit einer einfachen Abfrage wird bestimmt, welcher Operator für die Sortierung verwendet werden soll. Wenn orderByDirection den Wert „asc“ hat, wird der Operator OrderBy für die Sortierung verwendet. Sonst wird der Operator OrderByDescending für die Sortierung verwendet.


orderByDirection == "asc" ? "OrderBy" : "OrderByDescending"



Als Letztes erstellen wir unsere Abfrage mithilfe der CreateQuery-Methode in dem wir die Variable mc als Parameter für die CreateQuery-Methode definieren.


IQueryable orderedQuery = query.Provider.CreateQuery(mc);



Wenn Sie Interesse an dynamische LINQ-Abfragen haben, kann ich Euch folgenden Text sehr empfehlen.


How to: Use Expression Trees to Build Dynamic Queries


Nochmals danke an Jan Welker wegen seine Anfrage.

No comments: