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>
?
Antworten
Zu viele Anzeigen?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();
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();
}
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.
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