Estoy utilizando la biblioteca/muestra de Dynamic Linq de Microsoft para hacer un pedido en una lista. Así, por ejemplo, tengo el siguiente código C#:Excepción de referencia nula en una expresión de LINQ dinámico
myGrid.DataSource=repository.GetWidgetList()
.OrderBy(sortField + " " + sortDirection).ToList();
tengo un caso en el que mi objeto tiene un 0: 1 relación con otro objeto, que tiene una propiedad que se manifiesten en la red. Cuando intentamos ordenar esto, funciona bien siempre y cuando todos mis widgets tengan este elemento secundario. Estamos ordenando por Child.Name
por ejemplo. Sin embargo, cuando Child es nulo, obtenemos la excepción de referencia nula.
Tengo algunas opciones aquí que sé que podría seleccionar en un tipo anónimo y vincular a eso, también podría exponer Child.Name en el objeto principal y manejar esto a través de código (que no me gusta comprender mi modelo de objeto para esto).
En un mundo ideal, me gustaría actualizar la biblioteca para manejar este caso. Antes de sumergirme en él, me pregunto si alguien se ha topado con esto o no y ya tiene una solución.
Editar
Parece que no me explico lo suficientemente bien. Estoy usando el Dynamic Linq Library que viene con el C# samples. Esta biblioteca añade algunas extensiones agradables que le permiten utilizar una serie de in-situ una expresión lambda Así que mi código es en realidad algo como esto:
private void BindGrid(sortField,sortDirection)
{
this.grid.DataSource=....OrderBy("MyField ASC")....
}
Por supuesto que la cadena no se sustituye con los parámetros. Pero esto nos permite cambiar la clasificación de forma dinámica a medida que el usuario hace clic en un encabezado de la grilla. No tenemos que hacerlo si no es lógico para manejar todas las permutaciones.
Mi solución como he documentado abajo cambia mi buen método limpio en:
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();
}
Y si bien esto funciona, esto ahora significa que tengo que actualizar el código a medida que añadimos nuevos campos o propiedades que queremos exponer en la grilla que se encuentran en un objeto secundario.
No, esto no es a lo que me refiero. El linq dinámico es parte del código de muestra C# y le permite usar una cadena como OrderBy, por ejemplo. Compila la cadena a una expresión lambda en tiempo de ejecución. – JoshBerke
¿Por qué se aceptó esta respuesta como la respuesta real? Estoy en la misma situación. – Mike