スキーマを簡単に変更できないデータがDBから出ています。それを並べ替えて、数値IDに基づいてコントロールにバインドしたいと思います。問題は、変換の試行時に、APIが数値をint
およびLinq barfsではなく文字列フィールドに保存することです。
myControl.DataSource = dataFromDB.OrderBy(o => int.Parse(o.StringHoldingAnInt));
LINQ to Entitiesはメソッド 'Int32 Parse(System.String)'メソッドを認識せず、このメソッドはストア式に変換できません。
Convert.ToInt32
も機能しません。
LINQ to Entitiesはメソッド 'Int32 ToInt32(System.String)'メソッドを認識せず、このメソッドはストア式に変換できません。
文字列としての並べ替えは、値がすべて同じではなく、1、10、11、2、3のように並べ替えられるため、適切ではありません。
データベースクエリを利用して結果をフィルター処理していないため、これはそれほど効率的ではありませんが、基本的にはすべてのデータをクエリし、クライアントでフィルター処理します。
myControl.DataSource = dataFromDB.ToList().OrderBy(o => int.Parse(o.StringHoldingAnInt));
DB側でも可能です。アイデアは here から取得されます。したがって、適切にフォーマットされた文字列で並べ替えを行います(左側にゼロ文字が追加され、次に右側から必要な文字数が取得されます)
myControl.DataSource = dataFromDB
.OrderBy(o => DbFunctions.Right("00000" + o.StringHoldingAnInt, 7));
クエリをリストに変換できます:
var query = ...;
var list = query.ToList();
これで、値を変換して並べ替えることができます。
list.OrderBy(o => int.Parse(o.StringHoldingAnInt));
この問題は、データベースから取得した多くの値を取得していて、メモリ内で注文することです。