2010-02-18 9 views
19

Trabajando con cuatro tablas.Pedido de LinqPor rupturas con propiedad de navegación nula

Usuarios -> tiene información de usuario sencillo y de un identificador de usuario y una DepartmentID (int)
Grupos -> Información de grupo básico que incluye un GroupId
GroupsMembers -> tabla que tiene la relación entre un grupo y sus miembros, muchos de muchos relación, por lo groupid y ID de usuario son las columnas
departamentos -> información básica, incluyendo el departamento deptid

tengo una FK de la DepartmentID en la tabla de usuarios al ID deparmtnet en la tabla de departamentos.

FK grupos de GID al groupsmembers GROUPID FK de los usuarios identificador de usuario ID de usuario a groupsmembers

Esto permite que los grupos de la edmx que tienen una propiedad de los usuarios de navegación que tendrá todos los miembros del grupo.

var grp = grpSource.FirstOrDefault(g => g.GroupID == groupID) 
if (grp.GroupID > 0) 
{ 
    var userQuery = from u in grp.Users 
        where !u.Deleted 
        select u; 
    userQuery = userQuery.OrderBy(u => u.Department.Name); 
} 

Estoy incluyendo Users.Department.

El problema se debe a que los usuarios no necesitan tener un departamento, por lo que la columna del departamento es anulable. Si hay algún usuario para el cual el departamentoid es nulo, el pedido se rompe y dice que el departamento es nulo. Si no hay ningún departamentoid nulo, funciona bien. Necesito una forma de ordenar basada en Department.Name, incluso si hay departmentids nulos. ¿Alguna sugerencia?

Respuesta

40

Puede utilizar el operador condicional para comprobar si el departamento es nulo:

userQuery = userQuery.OrderBy(u => (u.Department != null) ? u.Department.Name : String.Empty); 

Para una mayor claridad, he creado el siguiente método de extensión:

public static TResult IfNotNull<TSource, TResult>(this TSource obj, Func<TSource, TResult> selector, TResult defaultValue) 
    { 
     if (obj != null) 
      return selector(obj); 
     return defaultValue; 
    } 

Puede ser utilizado de la siguiente manera:

userQuery = userQuery.OrderBy(u => u.Department.IfNotNull(d => d.Name, String.Empty)); 
+0

perfecto. Estaba llegando a eso solo, creo, pero no estaba seguro de si la comparación se haría de manera récord :-) – Steph

0

¿Qué le parece usar el operador de coalescencia?

userQuery = userQuery.OrderBy(u => u.Department.Name ?? string.Empty); 
Cuestiones relacionadas