LINQ OrderBy名ThenBy ChildrenCollection.Name

c# entity-framework linq linq-to-entities

質問

LINQでOrderByを実行してからThenByとThenByを実行して、親オブジェクトの子を使用して2次順序付けを行う方法はありますか。

_repository.GetActiveDepartmentGroupsWithDepartments().OrderBy(c => c.DepartmentGroupName).ThenBy(c => c.Departments.OrderBy(d => d.DepartmentName))

上記の場合、c.DepartmentsはEntityCollectionです。

ところで:私は上記を試して、それからToList()を実行すると、私はこのエラーが出ます:

DbSortClause expressions must have a type that is order comparable.
Parameter name: key

手助けや手引きを事前に感謝します。

受け入れられた回答

すべての部署の一覧を部署名の順に並べ替えようとしているようです。もしそうなら、あなたはおそらくこのような何かをしたいでしょう:

var res = from c in _repository.GetActiveDepartmentGroupsWithDepartments()
          from d in c.Departments
          orderby c.DepartmentGroupName, d.DepartmentName
          select d;

またはメソッドの構文では:

var res = _repository.GetActiveDepartmentGroupsWithDepartments()
                     .SelectMany(c => c.Departments, (c,d) => new { c, d })
                     .OrderBy(x => x.c.DepartmentGroupName)
                     .ThenBy(x => x.d.DepartmentName)
                     .Select(x => x.d);

人気のある回答

Deparmentはコレクションなので、ソートに使用するにはそれをスカラーに変換する必要があります。

1つの選択肢は、コレクション内の単一のエンティティ、たとえば最初の部署の名前を選択することです。

_repository.GetActiveDepartmentGroupsWithDepartments()
   .OrderBy(c => c.DepartmentGroupName)
   .ThenBy(c => c.Departments
       .OrderBy(d => d.DepartmentName)
       .FirstOrDefault()
       .DepartmentName
    )

もう1つの選択肢は、コレクション自体のプロパティ(部門数など)で並べ替えることです。

_repository.GetActiveDepartmentGroupsWithDepartments()
   .OrderBy(c => c.DepartmentGroupName)
   .ThenBy(c => c.Departments.Count())


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ