2009-11-09 19 views
6

Tengo una lista de objetos que estoy tratando de unirse a una vista de lista. Estoy ordenando por dos propiedades. Existe el problema por el cual algunos registros pueden no tener una de las propiedades. Esto está causando un error. Me gustaría enlazar aún los registros que tienen la propiedad.Comprobar si la propiedad es nulo en la expresión lambda

IEnumerable<ERec> list = retailerList.Cast<ERec>(); 
lvwRetailStores.DataSource = list.OrderByDescending(r => r.Properties["RS_Partner Type"].ToString()) 
           .ThenBy(r => r.Properties["RS_Title"].ToString()); 
+0

¿Quieres registros faltantes que la propiedad sea al principio o al final de la lista ordenada? – outis

Respuesta

7
list.Where(r => r.Properties["RS_Partner_Type"] != null && r.Properties["RS_Title"] != null) 
    .OrderByDescending(r => r.Properties["RS_Partner Type"].ToString()) 
    .ThenBy(r => r.Properties["RS_Title"].ToString()); 

O en lugar de! = Null, utilice cualquier prueba de la colección de propiedades tiene.

0

Se puede utilizar una expresión ternaria en el lambda:

list.OrderByDescending(r => r.Properties["RS_Partner_Type"] == null ? null : r.Properties["RS_Partner Type"].ToString()) 
    .ThenBy(r => r.Properties["RS_Title"] == null ? null : r.Properties["RS_Title"].ToString()); 
+0

Debo señalar que, una vez que las lambdas empiezan a llegar tan lejos, es una buena idea declararlas como funciones para limpiar el código. – Serguei

0

Otro enfoque común es dar a la colección un valor predeterminado adecuado, y volver que cuando la colección no tiene una clave particular. Por ejemplo, si Properties implementa IDictionary,

public static class IDictionaryExtension { 
    public static TValue GetValue<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key, TValue default) { 
     TValue result; 
     return dict.TryGetValue(key, out result) ? result : dflt; 
    } 
} 
... 
lvwRetailStores.DataSource = list.OrderByDescending(r => r.GetValue("RS_Partner Type", "").ToString()) 
           .ThenBy(r => r.GetValue("RS_Title","").ToString()); 
1

que he encontrado que el ?? El operador funciona bien Yo uso Paréntesis para evaluar nula,

Por ejemplo:

Datetime? Today = DateTimeValue // Check for Null, if Null put Today's date datetime GoodDate = Today ?? DateTime.Now

Esta misma lógica funciona en Lambda, sólo tiene que utilizar paréntesis para garantizar que se utilizan las comparaciones correctas.

Cuestiones relacionadas