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