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



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因