25

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

LINQ を使用して結果をショートコードでグループ化し (そしてすべての結果を保持し)、それらのグループを並べ替えてリストを返したいと考えています。

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

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

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

これが可能かどうかは誰にもわかりますか?

4

2 に答える 2

59

試す

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

最初にすべてを並べ替えてからグループ化するのではなく、各グループの内容を個別に並べ替えます。

于 2012-05-10T09:27:27.127 に答える
7

実際、短いコードでグループ化するのではなく、それらで並べ替えたいと考えています。したがって、次のクエリでうまくいくはずです。

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()
于 2012-05-10T09:17:48.677 に答える