Linq OrderBy打破导航属性为null

时间:2010-02-18 16:52:37

标签: entity-framework linq-to-entities nullable sql-order-by

使用四个表格。

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

我有一个来自users表中的departmentid的fk到departments表中的deparmtnet id。

FK从groupidid到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的离开。有什么建议吗?

2 个答案:

答案 0 :(得分:45)

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

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

答案 1 :(得分:0)

如何使用coalesce运算符?

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