753 Stimmen

Dynamisches LINQ OrderBy auf IEnumerable<T> / IQueryable<T>

Ich habe ein Beispiel in der VS2008 Beispiele für Dynamic LINQ, mit dem Sie eine SQL-ähnliche Zeichenfolge verwenden können (z. B. OrderBy("Name, Age DESC")) für die Bestellung. Leider funktioniert die enthaltene Methode nur bei IQueryable<T> . Gibt es eine Möglichkeit, diese Funktionalität auf IEnumerable<T> ?

4voto

Sameer Alibhai Punkte 2952

Hier ist noch etwas, das ich interessant fand. Wenn Ihre Quelle eine DataTable ist, können Sie eine dynamische Sortierung verwenden, ohne Dynamic Linq zu benutzen

DataTable orders = dataSet.Tables["SalesOrderHeader"];
EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
                                         orderby order.Field<DateTime>("OrderDate")
                                         select order;
DataView view = query.AsDataView();
bindingSource1.DataSource = view;

Hinweis: http://msdn.microsoft.com/en-us/library/bb669083.aspx (Mit DataSetExtensions)

Hier ist eine weitere Möglichkeit, dies zu tun, indem man sie in eine DataView umwandelt:

DataTable contacts = dataSet.Tables["Contact"];    
DataView view = contacts.AsDataView();    
view.Sort = "LastName desc, FirstName asc";    
bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();

4voto

k1developer Punkte 63

Sie können dies verwenden:

        public List<Book> Books(string orderField, bool desc, int skip, int take)
{
    var propertyInfo = typeof(Book).GetProperty(orderField);

    return _context.Books
        .Where(...)
        .OrderBy(p => !desc ? propertyInfo.GetValue(p, null) : 0)
        .ThenByDescending(p => desc ? propertyInfo.GetValue(p, null) : 0)
        .Skip(skip)
        .Take(take)
        .ToList();
}

4voto

Richard YS Punkte 1342

Sie können die IEnumerable in IQueryable umwandeln.

items = items.AsQueryable().OrderBy("Name ASC");

3voto

Sajed Punkte 674

Sie können ein Wörterbuch von String zu Func<> wie folgt definieren:

Dictionary<string, Func<Item, object>> SortParameters = new Dictionary<string, Func<Item, object>>()
{
    {"Rank", x => x.Rank}
};

Und verwenden Sie es so:

yourList.OrderBy(SortParameters["Rank"]);

In diesem Fall können Sie dynamisch nach Zeichenfolgen sortieren.

3voto

joaopintocruz Punkte 271

Dank an Maarten ( Abfrage einer Sammlung mit dem PropertyInfo-Objekt in LINQ ) Ich habe diese Lösung:

myList.OrderByDescending(x => myPropertyInfo.GetValue(x, null)).ToList();

In meinem Fall war ich auf einem "ColumnHeaderMouseClick" (WindowsForm) arbeiten, so fand gerade die spezifische Spalte gedrückt und seine entsprechende PropertyInfo:

foreach (PropertyInfo column in (new Process()).GetType().GetProperties())
{
    if (column.Name == dgvProcessList.Columns[e.ColumnIndex].Name)
    {}
}

OR

PropertyInfo column = (new Process()).GetType().GetProperties().Where(x => x.Name == dgvProcessList.Columns[e.ColumnIndex].Name).First();

(achten Sie darauf, dass die Spaltennamen mit den Objekteigenschaften übereinstimmen)

Prost

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X