1.21 jigowatts

Great Scott!

LINQ to EntitiesでDistinctするとOrder Byが効かなくなる?

概要

DistinctとOrder Byを使ったクエリの結果の並び順が意図した結果にならないことがありました。
どうやら書き方がまずかったようで、Distinctメソッドの結果に対してOrderByメソッドを使う必要があるようなのです。

検証

これが対象のデータです。
f:id:sh_yoshida:20140201180707p:plain

Name項目に対してDistinctをかけて重複をなくし、降順で並び替えたいとします。

まず、最初に意図した結果とならなかったコードです。

using System;
using System.Linq;

namespace EFConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            using (EDMEntities Context = new EDMEntities()) {
                var rs = (from t in Context.Products
                         orderby t.Name descending //降順を指定
                         select new { Name = t.Name}
                         ).Distinct(); //重複をなくす

                foreach (var r in rs) {
                    Console.WriteLine(r.Name);
                }
            }
            Console.ReadKey();
        }
    }
}

結果は以下のとおり重複は取り除けるものの昇順で出力されてしまいました。

A
B
C
D
E
F

正しく並び替えるにはDistinctメソッドの結果に対してOrderByメソッドを使ってあげるとうまくいきました。

var rs = (from t in Context.Products
          select new { Name = t.Name }
         )
         .Distinct()
         .OrderByDescending(x => x.Name);

おー、これこれ。

F
E
D
C
B
A

まとめ

SQLライクに書けるからといって適当に扱ってしまうと思わぬ違いにぐぬぬとなってしまいます。
f:id:sh_yoshida:20140201183807p:plain