Ich verwende die Dynamic Linq Library / Sample von Microsoft, um eine Liste zu bestellen. So habe ich zum Beispiel den folgenden C # -Code:
myGrid.DataSource=repository.GetWidgetList()
.OrderBy(sortField + " " + sortDirection).ToList();
Ich habe einen Fall, in dem mein Objekt eine 0: 1-Beziehung zu einem anderen Objekt hat, dessen Eigenschaft möglicherweise im Raster angezeigt wird. Wenn wir versuchen, dies zu sortieren, funktioniert es einwandfrei, solange alle meine Widgets dieses Kind haben. Wir bestellen zum Beispiel nach Child.Name
. Wenn Child jedoch null ist, erhalten wir die Nullreferenzausnahme.
Ich habe hier einige Optionen, von denen ich weiß, dass ich sie in einen anonymen Typ auswählen und daran binden kann. Ich könnte auch den Child.Name für das übergeordnete Objekt verfügbar machen und dies über Code behandeln (was ich nicht gerne als mein Objektmodell dafür betrachte ).
In einer idealen Welt möchte ich die Bibliothek aktualisieren, um diesen Fall zu behandeln. Bevor ich darauf eingehe, frage ich mich, ob jemand darauf gestoßen ist oder nicht und bereits eine Lösung hat.
Bearbeiten
Sieht so aus, als hätte ich es nicht gut genug erklärt. Ich verwende die Dynamic Linq Library, die mit den C # -Beispielen geliefert wird . Diese Bibliothek fügt einige nette Erweiterungen hinzu, mit denen Sie eine Zeichenfolge anstelle eines Lambda-Ausdrucks verwenden können. Mein Code sieht also ungefähr so aus:
private void BindGrid(sortField,sortDirection)
{
this.grid.DataSource=....OrderBy("MyField ASC")....
}
Natürlich wird die Zeichenfolge dort durch die Parameter ersetzt. Dies ermöglicht es uns jedoch, die Sortierung dynamisch zu ändern, wenn der Benutzer auf einen Rasterkopf klickt. Wir müssen nicht dann logisch sein, um alle Permutationen zu handhaben.
Meine Lösung, wie ich unten dokumentiert habe, ändert meine schöne saubere Methode in:
private void BindGrid()
{
var sortField=this._sortField;
if (sortField=="Child.Name")
{
sortField="iif(Child==null,null,Child.Name)";
}
this.grid.DataSource=repository.GetWidgetList()
.OrderBy(sortField + " " + this._sortDirection)
.ToList();
}
Und während dies funktioniert, bedeutet dies jetzt, dass ich diesen Code aktualisieren muss, wenn wir neue Felder oder Eigenschaften hinzufügen, die wir im Raster verfügbar machen möchten, die sich auf einem untergeordneten Objekt befinden.
Wenn ich dich richtig verstehe, denke ich, dass du das willst:
repository.GetParentObjects()
.OrderBy(p => p.Child == null ? "" : p.Child.Name);
LINQ kann SQL generieren, das diesen Ausdruck nachahmt.
Bei der Lösung habe ich festgestellt, dass es in meinem Fall wieder nicht ideal wäre, zu erkennen, wann der Ausdruck auf das Kind zugreifen wird, und den Sortierausdruck zu ändern
iif(Child == null,null,Child.Name) ASC
Im Idealfall kann diese Logik in die dynamische Bibliothek integriert werden. Ich möchte lieber nicht jedes Raster überall ändern, um alle Fälle zu behandeln, die davon betroffen sind.