LINQ to Entitiesでソート

部屋番号でのソートが必要になった。この部屋番号というやつが曲者で、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);

次期バージョンではできるようになるのだろうか。

コメントを残す