Linq OrderBy разрывается с нулевым свойством навигации - PullRequest
21 голосов
/ 18 февраля 2010

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

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

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

FK от группы groupid до groupsmembers groupid FK от пользователя userid к группам членов 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.

Проблема возникает из-за того, что у пользователей нет необходимости в отделе, поэтому столбец департамента обнуляется. Если есть какие-либо пользователи, для которых отправление имеет значение null, порядок прерывается и говорит, что u.Department имеет значение null. Если никакие компоненты не равны нулю, это прекрасно работает. Мне нужен способ сортировки на основе Department.Name, даже если есть нулевые департаменты. Есть предложения?

Ответы [ 2 ]

45 голосов
/ 18 февраля 2010

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

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));
0 голосов
/ 09 февраля 2018

Как насчет использования оператора coalesce?

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