Entity framework Linq OrderBy中断,导航属性为null

Entity framework Linq OrderBy中断,导航属性为null,entity-framework,linq-to-entities,nullable,sql-order-by,Entity Framework,Linq To Entities,Nullable,Sql Order By,使用四张桌子 用户->具有基本用户信息,包括用户ID和部门ID(int) 群组->包含群组ID的基本群组信息 GroupsMembers->具有组与其成员之间关系的表,多对多关系,因此groupid和userid是列 部门->基本部门信息,包括部门ID 我有一个fk,从users表中的departmentid到departments表中的DepartmentNet id FK从组groupid到组成员groupid 从用户userid到组成员userid的FK 这允许edmx中的组具有用户导航属

使用四张桌子

用户->具有基本用户信息,包括用户ID和部门ID(int)
群组->包含群组ID的基本群组信息
GroupsMembers->具有组与其成员之间关系的表,多对多关系,因此groupid和userid是列
部门->基本部门信息,包括部门ID

我有一个fk,从users表中的departmentid到departments表中的DepartmentNet id

FK从组groupid到组成员groupid 从用户userid到组成员userid的FK

这允许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列可以为空。如果有任何用户的departmentid为空,orderby将中断并说u.Department为空。如果没有部门ID为空,那么它工作得很好。我需要一种基于Department.Name的排序方法,即使有空的departmentID。有什么建议吗?

您可以使用条件运算符检查部门是否为空:

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

使用coalesce操作符怎么样

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

完美的我想这是我自己做的,但我不确定是否会在一个记录一个记录的基础上进行比较:-)
userQuery = userQuery.OrderBy(u => u.Department.Name ?? string.Empty);