2016-05-03 9 views
0

ich dynamisch Zeilen einer Tabelle sortieren rufen, wenn die orderby Spalte in der Tabelle Eltern ist es, die folgenden Aktionen ausführen ... Verwendung von Entity Framework dynamisch sortieren nach einer Spalte in einem Kind

public List<ServiceRequest> SortSRsByParentFields(string p_Criteria, 
                bool p_sortDescending, 
                bool p_ShowAll = true) { 

    var propertyInfo = typeof(ServiceRequest).GetProperty(p_Criteria); 
    var sortedList1 = new List<ServiceRequest>(); 
    var sortedList2 = new List<ServiceRequest>(); 

    var myServiceRequests = GetMyServiceRequests(); 
    var otherServiceRequests = GetOthersServiceRequests(); 

    if (p_sortDescending) 
    { 
     sortedList1 = myServiceRequests 
     .AsEnumerable() 
     .OrderByDescending(x => propertyInfo.GetValue(x, null)).ToList(); 

     sortedList2 = otherServiceRequests.AsEnumerable() 
     .OrderByDescending(x => propertyInfo.GetValue(x, null)) 
     .ThenBy(x => x.Client.LastNameFirst).ToList(); 
    } 
    else 
    { 
     sortedList1 = myServiceRequests.AsEnumerable() 
     .OrderBy(x => propertyInfo.GetValue(x, null)).ToList(); 
     sortedList2 = otherServiceRequests.AsEnumerable() 
     .OrderBy(x => propertyInfo.GetValue(x, null)) 
     .ThenBy(x => x.Client.LastNameFirst).ToList(); 
    } 

    var allSRs = p_ShowAll == false ? sortedList1.Concat(sortedList2).Take(1000) 
     .ToList() : sortedList1.Concat(sortedList2).ToList(); 
    return allSRs; 
    } 

Aber ich kann nicht Scheint, diese Methode funktionieren zu lassen, wenn die Spalte orderby in einer Kindtabelle ist (eine Tabelle, die sich auf den Elternteil bezieht, obwohl es ein FKey ist).

Die Frage ist also, wie kann ich das machen?

Antwort

0

EF ist nicht wirklich auf dynamische Sortierung ausgelegt. Aber es gibt Alternativen, die Sie für Fälle wie diesen verwenden können, ohne den Rest Ihres EF-Codes zu ersetzen.

Zum Beispiel mit Tortuga Chain Sie schreiben können:

ds.From("ServiceRequests", [filter]).WithSorting (new SortExpression(p_Criteria, p_sortDescending)).ToCollection<ServiceRequest>().Execute(); 

Sie können auch direkt nur SQL generieren, aber ich weiß nicht, diesen Ansatz empfehlen, weil Sie müssen sorgfältig die Art Ausdruck überprüfen, um sicherzustellen, ist eigentlich ein Spaltenname und kein SQL-Injection-Angriff.

Verwandte Themen