2010-02-18 10 views
19

Praca z czterema tabelami.Linq OrderBy zrywa z właściwością nawigacji, która jest nieważna

Użytkownicy -> zawiera podstawowe informacje użytkownika w tym identyfikatora użytkownika i departmentid (int)
grup -> Podstawowe informacje grupa w tym GroupID
GroupsMembers -> tabela, która ma związek między grupą i to członków, wielu wiele relacji, więc GroupID i userid są kolumnami
działy -> podstawowe informacje Dział tym deptid

mam FK z departmentid w tabeli użytkownikom id deparmtnet w tabeli działów.

FK z grup GroupID do groupsmembers GroupID FK od użytkowników id_uzytkownika do groupsmembers identyfikatora

Pozwala to grupy w edmx mieć właściwość użytkownikom nawigację, która będzie miała wszystkich członków grupy.

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

Dołączam Users.Department.

Problem pojawia się, ponieważ użytkownicy nie muszą mieć działu, więc kolumna departid jest pusta. Jeśli są jacyś użytkownicy, dla których departid ma wartość null, kolejność jest zerwana i mówi u.Department ma wartość null. Jeśli żaden dział nie jest pusty, działa dobrze. Potrzebuję sposobu sortowania na podstawie nazwy departamentu, nawet jeśli istnieją puste departamenty. Jakieś sugestie?

Odpowiedz

40

Można użyć operatora warunkowego, aby sprawdzić, czy dział jest zerowy:

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

Dla większej przejrzystości, stworzyłem następującą metodę rozszerzenia:

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

Może być stosowany w sposób następujący:

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

doskonała. Robiłem to na własną rękę, ale myślę, że nie byłbym pewien, czy porównanie będzie wykonane na podstawie rekordu :-) – Steph

0

Co powiesz na korzystanie z operatora koalescji?

userQuery = userQuery.OrderBy(u => u.Department.Name ?? string.Empty); 
Powiązane problemy