2011-11-10 19 views
19

DBからデータが出てきて、簡単にスキーマを変更できません。私はそれを並べ替え、数値IDに基づいてコントロールにバインドします。問題は、APIがintの代わりに文字列フィールドに数値を格納し、Linq barfsが変換を試みていることです。エンティティへ注文方法Linqクエリで文字列フィールドの整数を指定する

myControl.DataSource = dataFromDB.OrderBy(o => int.Parse(o.StringHoldingAnInt)); 

LINQは方法「のInt32解析(可能System.String)」メソッドを認識しない、この方法は、ストア式に変換することができません。

Convert.ToInt32も機能しません。

LINQ to Entitiesは、 'Int32 ToInt32(System.String)'メソッドを認識せず、このメソッドをストア式に変換することはできません。値がすべて同じ長さではありません、それはこのようにそれらを注文してしまうため、文字列としてソート

は適していません:1、10、11、2、3 ...

+0

どのくらいのデータがありますか?クライアント側でソートすることは可能でしょうか? – dlev

+0

あなたはすべての文字列が同じ長さになるように文字列を '0'で埋めることができますが、String.PadLeftはLinqでサポートされているかどうかはわかりません。 –

+0

@dlev DBの数百行、私の質問から省略したWhere()クエリの後の数十行しかありません。 –

答えて

14

このウォン」結果をフィルタリングするためにデータベースクエリを利用していないため、ほぼ効率的ですが、基本的にすべてのデータをクエリし、クライアントでフィルタリングします。

myControl.DataSource = dataFromDB.ToList().OrderBy(o => int.Parse(o.StringHoldingAnInt)); 
+0

私のunabridgedクエリは、order byコマンドの前にWhere()を実行して、データ量を適切なサイズに減らして、クライアント側の処理負担を過大にしてはいけません。 –

1

あなたがリストにクエリを変換することができます:

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

今、あなたはそれを変換することによって値で注文することができます:

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

をこれに伴う問題は、あなたが取得しているということです彼らはすべてデータベースから来て、あなたはメモリ内で注文します。

+3

誰も混乱しないので、 '.OrderBy()'は 'IEnumerable'を返します。上の 'list.OrderBy()'行は、 '.OrderBy()'の戻り値を変数に代入していないので、現在何もしません。 –

1

DB側で行うことができます。アイデアはhereから取られます。したがって、適切に書式設定された文字列でソートします(0文字が左側に追加され、必要な文字数が右側から取得されます)

myControl.DataSource = dataFromDB 
    .OrderBy(o => DbFunctions.Right("00000" + o.StringHoldingAnInt, 7)); 
関連する問題