Linq OrderBy はナビゲーション プロパティが null になると機能しなくなります 質問する

Linq OrderBy はナビゲーション プロパティが null になると機能しなくなります 質問する

4 つのテーブルを操作します。

ユーザー -> ユーザー ID と部門 ID (int) を含む基本的なユーザー情報があります。
グループ -
> グループ ID を含む基本的なグループ情報があります。グループ メンバー -> グループとそのメンバーの関係 (多対多の関係) を持つテーブルなので、グループ ID とユーザー ID が列になります。
部門 -> 部門 ID を含む基本的な部門情報があります。

ユーザー テーブルの departmentid から departments テーブルの deparmtnet id への fk があります。

グループのグループ ID からグループメンバーのグループ ID への FK、ユーザーのユーザー ID からグループメンバーのユーザー ID への 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);
}

Users.Department を含めています。

問題は、ユーザーに部門がなくてもよいため、departmentid 列が null 値になるという点にあります。departmentid が null のユーザーがいる場合、orderby は失敗し、u.Department は null になります。departmentid が null でない場合は、問題なく動作します。departmentid が null であっても、Department.Name に基づいて並べ替える方法が必要です。何か提案はありますか?

ベストアンサー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));

おすすめ記事