Sto utilizzando la libreria/campione Dynamic Linq di Microsoft per eseguire l'ordine in un elenco. Così, per esempio, ho il seguente codice C#:Eccezione di riferimento null in un'espressione LINQ dinamica
myGrid.DataSource=repository.GetWidgetList()
.OrderBy(sortField + " " + sortDirection).ToList();
ho un caso in cui il mio oggetto ha un 0: 1 rapporto con un altro oggetto, che ha una proprietà che può essere visualizzato nella griglia. Quando proviamo a ordinare questo, funziona bene fino a quando tutti i miei Widget hanno questo figlio. Ad esempio, stiamo ordinando tramite Child.Name
. Tuttavia, quando Child è null, otteniamo l'eccezione di riferimento null.
Ho alcune opzioni qui che so che potrei selezionare in un tipo anonimo e collegarlo, potrei anche esporre il Child.Name sull'oggetto genitore e gestirlo via codice (che non mi piace comprendendo il mio modello oggetto per questo).
In un mondo ideale mi piacerebbe aggiornare la libreria per gestire questo caso. Prima di immergermi in questo, mi chiedo se qualcuno lo abbia imbattuto o no e abbia già una soluzione?
Modifica
Sembra che non ho spiegato abbastanza bene. Sto usando lo Dynamic Linq Library fornito con lo C# samples. Questa libreria aggiunge alcune belle estensioni che consentono di utilizzare una serie di inplace un'espressione lambda Quindi il mio codice è in realtà qualcosa di simile:
private void BindGrid(sortField,sortDirection)
{
this.grid.DataSource=....OrderBy("MyField ASC")....
}
Naturalmente la stringa non viene sostituito con i parametri. Ma questo ci consente di modificare l'ordinamento in modo dinamico mentre l'utente fa clic su un'intestazione di griglia. Non dobbiamo, se non altro, la logica per gestire tutte le permutazioni.
La mia soluzione come ho documentato muggito cambia il mio bel metodo pulito 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();
}
E mentre questo funziona, questo ora significa che devo aggiornare il codice come aggiungiamo nuovi campi o proprietà che vogliamo esporre nella griglia che si trovano su un oggetto figlio.
No, questo non è quello a cui mi riferisco. Linq dinamico fa parte del codice di esempio C# e consente di utilizzare una stringa come OrderBy, ad esempio. Compila la stringa con un'espressione lambda in fase di esecuzione. – JoshBerke
Perché questa risposta è stata accettata come risposta effettiva? Sono nella stessa situazione. – Mike