Linq OrderBy порывает со свойством навигации, являющимся пустым

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

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

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

FK от групп groupid к groupsmembers groupid FK от пользовательского идентификатора пользователя до groupsmembers идентификатора пользователя

Это позволяет группам в 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);
}

Среди меня Пользователи. Отдел.

Проблема возникает, потому что у пользователей не должно быть отдела, таким образом, departmentid столбец nullable. Если существуют какие-либо пользователи, для которых departmentid является пустым, orderby повреждает и говорит u. Отдел является пустым. Если никакие departmentids не являются пустыми, это работает отлично. Мне нужен способ отсортировать на основе Отдела. Имя, даже если существует пустой указатель departmentids. Какие-либо предложения?

21
задан Steph 18 February 2010 в 16:52
поделиться

1 ответ

Вы можете использовать условный оператор, чтобы проверить, имеет ли отдел значение 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));
45
ответ дан 29 November 2019 в 20:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: