Подтвердить что ты не робот

Linq OrderBy ломается, когда свойство навигации имеет значение null

Работа с четырьмя таблицами.

Пользователи → имеют базовую информацию о пользователе, включая идентификатор пользователя и идентификатор отдела (int)
Группы → базовая информация о группе, включая группу GroupsMembers → таблица, которая имеет отношение между группой и ее членами, отношение многих к многим, поэтому groupid и userid являются столбцами
Отделы → информация о базовом отделе, включая deptid

У меня есть fk from departmentid в таблице users для идентификатора deparmtnet в таблице разделов.

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 имеет значение NULL. Если есть пользователи, для которых ведомство равно null, orderby ломается и говорит, что u.Department имеет значение null. Если ни один из отделов не является нулевым, он отлично работает. Мне нужен способ сортировки по имени Department.Name, даже если есть нулевые ведомства. Любые предложения?

4b9b3361

Ответ 1

Вы можете использовать условный оператор, чтобы проверить, является ли ведомство нулевым:

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