web-dev-qa-db-ja.com

LINQ group by then結果のグループを並べ替える

次の3つの列、ID、ShortCode、UploadDateを持つテーブルがあります。

LINQを使用して、結果をショートコードでグループ化し(すべての結果を保持し)、それらのグループを順序付けてリストを返します。

私は次のものを持っています:

 rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList<PDFDocument>().
GroupBy(b=>b.ShortCode)
.SelectMany(b=>b).ToList<PDFDocument>()

ShortCodeでグループ化されたすべての結果、UploadDateでソートされた各グループ内のアイテム、および最新のドキュメントが最初に含まれるグループでソートされたグループを返します。

これが可能かどうか誰でも知っていますか?

18
Ketchup

試して

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
    .AsEnumerable()
    .OrderByDescending(d => d.UploadDate)
    .GroupBy(d => d.ShortCode)
    .SelectMany(g => g)
    .ToList();

これは

  • アップロード日でアイテムを注文します(降順が新しい順)
  • その後、それらを短いコードでグループ化します-各グループ内でアイテムは依然としてソートされます
  • グループはまだ降順であるため、再度注文する必要はありません
  • 最後に結果を単一のリストに連結します

パフォーマンスが問題になる場合は、多くの方が良いでしょう

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
    .AsEnumerable()
    .GroupBy(d => d.ShortCode)
    .Select(g => g.OrderByDescending(d => d.UploadDate))
    .OrderByDescending(e => e.First().UploadDate)
    .SelectMany(e => e)
    .ToList();

最初にすべてをソートしてからグループ化するのではなく、各グループのコンテンツを個別にソートします。

40
Rawling

実際、短いコードでグループ化するのではなく、それらで並べ替えます。したがって、次のクエリでこのトリックを行う必要があります。

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList()
.OrderBy(b => b.ShortCode)
.ThenBy(b => b.UploadDate)
.ToList()

編集 GroupByを本当に使用する場合は、次の方法で使用できます。

 rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList()
.GroupBy(b => b.ShortCode)
.SelectMany(grouping => grouping.OrderBy(b => b.UploadDate))
.ToList()

しかし、私はそれを落胆させます。そもそもグループが必要ない場合は、グループを作成しても意味がありません。

2番目の編集

UpdateTimeでグループ化されたグループも望んでいませんでした。クエリが少し複雑になります。

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList()
.GroupBy(b => b.ShortCode)
.Select(grouping => grouping.OrderByDescending(b => b.UploadDate))
.OrderByDescending(grouping => grouping.First().UploadDate)
.SelectMany(grouping => grouping)
.ToList()
5
Falanwe