Używam biblioteki dynamicznej Linq/próbki firmy Microsoft do zamawiania na liście. Tak na przykład mam następujący kod C#:Wyjątek odwołania zerowego w dynamicznym wyrażeniu LINQ
myGrid.DataSource=repository.GetWidgetList()
.OrderBy(sortField + " " + sortDirection).ToList();
Mam przypadek gdzie mój przedmiot posiada 0: 1 związek z innym obiektem, który posiada właściwości, które mogą być wyświetlane w siatce. Kiedy próbujemy to sortować, działa dobrze, o ile wszystkie moje widżety mają to dziecko. Zamawiamy na przykład przez Child.Name
. Jednak gdy wartość Child ma wartość null, otrzymamy wyjątek odwołania do wartości zerowej.
Mam kilka opcji, o których wiem, że mogłem wybrać anonimowy typ i powiązać z tym, mogę również wystawiać Child.Name na obiekcie nadrzędnym i obsługiwać to za pomocą kodu (Którego nie lubię obejmującego moje model obiektowy dla tego).
W idealnym świecie chciałbym zaktualizować bibliotekę do obsługi tej sprawy. Zanim zagłębię się w to, zastanawiam się, czy ktoś już to przebiegł czy nie i czy ma już rozwiązanie?
Edit
Wygląda na to, że nie wyjaśnił dostatecznie dobrze. Używam Dynamic Linq Library dostarczanego z C# samples. Biblioteka ta dodaje kilka ciekawych rozszerzeń, które pozwalają korzystać z inplace ciąg wyrażenia lambda Więc mój kod jest faktycznie coś takiego:
private void BindGrid(sortField,sortDirection)
{
this.grid.DataSource=....OrderBy("MyField ASC")....
}
Oczywiście łańcuch nie otrzymuje z parametrami. Ale to pozwala nam dynamicznie zmieniać sortowanie, gdy użytkownik kliknie nagłówek siatki. Nie musimy, jeśli nie logika innego, obsłużyć wszystkie permutacje.
Moje rozwiązanie jak udokumentowane mieszek zmienia moje ładne czyste metodę w:
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();
}
A gdy to działa, teraz oznacza to muszę aktualizować ten kod jak dodać nowe pola lub właściwości, które chcemy eksponować w siatce znajdującej się na obiekcie podrzędnym.
Nie, to nie jest to, co mam na myśli. Dynamiczny linq jest częścią przykładowego kodu C# i pozwala na przykład użyć łańcucha jako OrderBy. Kompiluje ciąg do wyrażenia lambda w czasie wykonywania. – JoshBerke
Dlaczego ta odpowiedź została przyjęta jako faktyczna odpowiedź? Jestem w tej samej sytuacji. – Mike