部屋番号でのソートが必要になった。この部屋番号というやつが曲者で、VARCHAR(4)のカラムになっていて、頭にアルファベットのプレフィックスがつく場合とつかない場合がある。できればこうしたい。
101 102 205 1500 2020 A103 A104 A1501 A2021
普通にソートするとこうはならない。
entities.Room .OrderBy(r => r.room_no) .Select(r => r);
101 102 1500 2020 205 A103 A104 A1501 A2021
プレフィックスがないもので考えてみれば、
entities.Room .OrderBy(r => int.Parse(r.room_no)) .Select(r => r);
とかやりたいところだが、このようにエラーになってしまう。
Where句にはstringで条件を記述できたが、OrderByではできないようなので、SQLiteの関数を直接使うこともできない。
LINQ to Entitiesの問題なのか、SQLite.NETの問題なのかというと、両方の問題な気がする。
LINQ Method cannot be translated into a store expression. | Arnold Matusz's Blog
解決法はToList()を使ってリストに変換した後でOrderByすればクライアントサイドでのソートになるので、上記の問題は発生しないようである。
entities.Room.ToList() .OrderBy(r => int.Parse(r.room_no)) .Select(r => r.room_no);
次期バージョンではできるようになるのだろうか。