2017-11-21 4 views
3

Ich habe ein Raster mit Spalten. Wenn der Grid-Spaltenkopf ausgewählt ist, poste/ajax an den Server, wobei die Kopfzeile ausgewählt ist, um x Zeilen zurückzugeben.Generic Func benötigt Sortierung von Entity Framework-Sammlung

Im folgenden Code ist RefNo eine Ganzzahl, während PropertySectionNumber eine Zeichenfolge ist.

Wie kann man eine generische Funktion erstellen, die einen String übernimmt, aber einen Func zurückgibt, der in der linq-Anweisung verwendet werden soll?

if (sort.dir == SortDirection.Asc) 
{ 
    switch (sort.field) 
    { 
     case "RefNo": 
      qry = qry.OrderBy(x => x.RefNo); 
      break; 
     case "ProposalSectionNumber": 
      qry = qry.OrderBy(x => x.ProposalSectionNumber); 
      break;      
    } 
} 
else 
{ 
    switch (sort.field) 
    { 
     case "RefNo": 
      qry = qry.OrderByDescending(x => x.RefNo); 
      break; 
     case "ProposalSectionNumber": 
      qry = qry.OrderByDescending(x => x.ProposalSectionNumber); 
      break; 

    } 
} 

Ich möchte so etwas wie String sortOrder = "RefNo" var sortfunc = SortFunc (sortOrder)

if (sort.dir == SortDirection.Asc) 
{ 
    qry = qry.OrderBy(sortFunc) 
} 
else 
{ 
    qry = qry.OrderByDesc(sortFunc) 
} 

ich die Funktion SortFunc (die auf der Grundlage String zurückgibt zu schaffen haben gekämpft tun oder Ganzzahl)

Was ist der beste Weg, dies zu erreichen?

+1

die System.Linq verwenden. Dynamisches nugget-Paket, Sie können nach dem Eigenschaftsnamen als Zeichenfolge sortieren. – Mant101

Antwort

3

Das Problem mit der Deklaration eines Typs für sortFunc ist, dass es von dem Typ des Feldes abhängt, nach dem Sie sortieren. Wenn alle Felder vom selben Typ sind, zB string s, könnten Sie den Typ Expression<Func<MyEntity,string>> für Ihre sortFunc Variable verwenden.

Es gibt eine andere Möglichkeit zum Entfernen von Code, wenn Sortierfelder keinen gemeinsamen Typ haben. Einführung einer generischen Hilfsmethode, die Sortierreihenfolge als Parameter übernimmt, und nennen es statt OrderBy/OrderByDescending:

private static IOrderedQueryable<T> AddOrderBy<T,TKey>(
    IQueryable<T> orig 
, Expression<Func<T,TKey>> selector 
, bool isAscending 
) { 
    return isAscending ? orig.OrderBy(selector) : orig.OrderByDescending(selector); 
} 

Jetzt können Sie Ihren Code wie folgt umschreiben:

var isAscending = (sort.dir == SortDirection.Asc); 
switch (sort.field) { 
    case "RefNo": 
     qry = qry.AddOrderBy(x => x.RefNo, isAscending); 
     break; 
    case "ProposalSectionNumber": 
     qry = qry.AddOrderBy(x => x.ProposalSectionNumber, isAscending); 
     break;      
}