web-dev-qa-db-ja.com

Linqクエリの文字列フィールドの整数をOrderByする方法

スキーマを簡単に変更できないデータが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));
16
Steve Danner

DB側でも可能です。アイデアは here から取得されます。したがって、適切にフォーマットされた文字列で並べ替えを行います(左側にゼロ文字が追加され、次に右側から必要な文字数が取得されます)

myControl.DataSource = dataFromDB
    .OrderBy(o =>  DbFunctions.Right("00000" + o.StringHoldingAnInt, 7));
5
Roman Koliada

クエリをリストに変換できます:

var query = ...;
var list = query.ToList();

これで、値を変換して並べ替えることができます。

list.OrderBy(o => int.Parse(o.StringHoldingAnInt));

この問題は、データベースから取得した多くの値を取得していて、メモリ内で注文することです。

1
Dismissile