2010-02-18 14 views
19

Utilizzo di quattro tabelle.Ordine LinqIn caso di interruzioni con proprietà di navigazione nulle

Utenti -> ha informazioni utente di base tra cui un'userid e una DepartmentID (int)
Gruppi -> informazioni sul gruppo di base tra cui un GroupID
GroupsMembers -> tabella che ha il rapporto tra un gruppo e suoi membri, molti a molti, così groupid e userid sono le colonne
dipartimenti -> Info Dipartimento di base tra cui deptid

ho un fk dal DepartmentID nella tabella utenti al id deparmtnet nella tabella reparti.

FK da gruppi GroupID a groupsmembers GroupID FK da parte degli utenti userid a groupsmembers userid

Questo permette ai gruppi nel edmx di avere una proprietà gli utenti di navigazione che avrà tutti i membri del gruppo.

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); 
} 

Sono incluso Users.Department.

Il problema deriva dal fatto che gli utenti non devono disporre di un reparto, pertanto la colonna departmentid è annullabile. Se ci sono utenti per i quali il departmentid è nullo, il orderby si interrompe e dice che u.Department è nullo. Se nessun dipartimento è nullo, funziona alla grande. Ho bisogno di un modo per ordinare in base a Department.Name anche se ci sono dei reparti nulli. Eventuali suggerimenti?

risposta

40

È possibile utilizzare l'operatore condizionale per verificare se l'organo è nullo:

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

Per maggiore chiarezza, ho creato il seguente metodo di estensione:

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

Può essere utilizzato come segue:

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

perfetto. Stavo pensando a quello da solo, ma non ero sicuro che il confronto sarebbe stato fatto su un record per record :-) – Steph

0

Come utilizzare l'operatore di coalesce?

userQuery = userQuery.OrderBy(u => u.Department.Name ?? string.Empty); 
Problemi correlati