MIT’s blog

個人的なメモかな

C#のLINQ to Entitiesで複数のソート

C#だろうとVBだろうと、まあ、そもそもSQLは素人レベルだけど、なんとなくだけど、ここまで40年以上プログラミングしてたりすると、ある程度予測が出来たりしてイメージして、それをLINQ的に書いてみたりしてるんですが、LINQにはクエリ式とメソッド式があるんだと。で、最初はクエリ式で

var races = from i in db.RaceInfo
                          orderby i.year descending, i.month descending, i.day descending
                          select i;

って感じで書いてたんですが、メソッド式で

var races = db.RaceInfo
                          .OrderByDescending(i => i.year)
                          .OrderByDescending(i => i.month)
                          .OrderByDescending(i => i.day)
                          .ToArray();

にしてみたんですが、上手くソートされない。よくよく調べると、

var races = db.RaceInfo
                          .OrderByDescending(i => i.year)
                          .ThenByDescending(i => i.month)
                          .ThenByDescending(i => i.day)
                          .ToArray();

としなければならない事が分かった。LINQには更にLINQ to EntitiesとLINQ to Objectがあるんだと。で、更に今回の用途では読込のみで更新なんかはしないので

var races = db.RaceInfo
                          .OrderByDescending(i => i.year)
                          .ThenByDescending(i => i.month)
                          .ThenByDescending(i => i.day)
                          .AsNoTracking()
                          .ToArray();

としてやると、かなりスピードアップしました。これするには、今回のプロジェクトではusing Microsoft.EntityFrameworkCore;の追加が必要でした。自分の使っているEntityFrameworkの参照を有効にする必要があるって事の様です。