Linq OrderBy打破導航屬性為null

entity-framework linq-to-entities nullable sql-order-by

使用四個表。

用戶 - >具有基本用戶信息,包括用戶ID和離開(int)
組 - >基本組信息,包括groupid
GroupsMembers - >具有組與其成員之間關係的表,多對多關係,因此groupid和userid是列
部門 - >基本部門信息,包括deptid

我有一個fk從users表中的departmentid到departments表中的deparmtnet id。

FK從組groupid到groupsmembers groupid FK從用戶userid到groupsmembers userid

這允許edmx中的組具有用戶導航屬性,該屬性將包含該組的所有成員。

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

我包括Users.Department。

問題出現是因為用戶不必擁有部門,因此departmentid列可以為空。如果有任何用戶為departmentid為null,則orderby中斷並表示u.Department為null。如果沒有離開是空的,那就很有效。我需要一種基於Department.Name進行排序的方法,即使有null的離開。有什麼建議?

一般承認的答案

您可以使用條件運算符來檢查部門是否為空:

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

為了提高清晰度,我創建了以下擴展方法:

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

它可以使用如下:

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

熱門答案

如何使用coalesce運算符?

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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因