Работа с четырьмя таблицами.
У пользователей-> есть информация о рядовом пользователе включая идентификатор пользователя и 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. Какие-либо предложения?
Вы можете использовать условный оператор, чтобы проверить, имеет ли отдел значение 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));