2012-01-23 20 views
1

私は以下の問題を抱えています: DBからデータを選択し、テーブルの各項目に対してモデルを作成します。 そのモデルには3つの言語で名前が含まれるリストが含まれています。 何らかの理由で、LINQはリストの初期化順序を保持しません。LINQリスト初期化からの初期化を維持しない初期化子

コード:

db.SA_BamaType 
      .Select(b => new BamaTypeModel() 
      { 
       id = b.p_bamatype, 
       bamatypeNames = new List<string>() 
       {b.bamatypeafdrukNL, b.bamatypeafdrukFR, b.bamatypeafdrukEN} 
      }).ToList(); 

しかし、私はこのリストをデバッグするとき、私はアイテムが位置からランダムに切り替えていることがわかります。 ENはインデックス0になりますが、NLはインデックス0になります。

辞書がこれに最適ですが、LINQは辞書を翻訳できないようですので、リストを使用しました。

+0

辞書に変換することができます。 [ToDictionary()メソッド](http://msdn.microsoft.com/en-us/library/system.linq.enumerable.todictionary.aspx)を参照してください。また、データベースから行を取得する場合、順序は次のようになります。特定のキー(またはキーのグループ)にクラスタード・インデックスを持たないか、結果セットを処理する前にソートしない限り、保証されることはありません。 –

+0

データベースからの注文は保証されない場合があります。しかし、List()は、渡された順序でアイテムを格納することを保証する必要があります!奇妙な。 –

+0

それは確かにかなり変です。それは重要な行の順序ではなく、リストの初期化子で割り当てるアイテムの順序です。リストの順序が失われているようです。私は辞書を使っていましたが、実際にはこの状況でもっとも良い方法ですが、まだリストが私が初期化した項目の順序を保持したくない理由は分かりません。 – Mortana

答えて

3

が、LINQはそれができる辞書にもちろん

を翻訳することはできませんようだ:

db.SA_BamaType 
      .AsEnumerable() 
      .Select(b => new BamaTypeModel() 
      { 
       id = b.p_bamatype, 
       bamatypeNames = new Dictionary<string, string> 
       { 
        { "NL", b.bamatypeafdrukNL }, 
        { "FR", b.bamatypeafdrukFR }, 
        { "EN", b.bamatypeafdrukEN } 
       } 
      }).ToList(); 
+0

ありがとう! .AsEnumerable()がありませんでした。初期化子で辞書を使用できるようになりました。 – Mortana

+0

これを分析して、シンプルなリストの代わりに.AsEnumerable()を辞書で使用すると、+ 15秒のpageloadの差を得ました。なぜ興味があるのか​​:.Asherenumerable()を.Where()の前に使用してメモリ内のテーブル全体をロードしてから、whereを実行します。これにより、より多くの負荷が発生します。詳細情報: http://stackoverflow.com/questions/3311244/understanding-asenumerable-in-linq-to-sql – Mortana

+0

@Mortana、それはメモリ内のすべてのデータではなく、AsEnumerableをロードToListメソッドです。 AsEnumerableの効果は、テーブルがIQueryableではなくIEnumerableとして扱われ、残りのクエリがSQLに変換されるのではなく行単位でメモリ内で実行されることです。 –

0
var items = db.SA_BamaType 
     .Select(b => 
     { 
      id = b.p_bamatype, 
      NL = b.bamatypeafdrukNL, 
      EN = b.bamatypeafdrukEN, 
      FR = b.bamatypeafdrukFR 
     }).ToList(); 
var models = items.Select(b=> 
    new BamaTypeModel() 
    { 
     id = b.id, 
     bamatypeNames = new List<string>() 
      {b.NL, b.FR, b.EN} 
    } 
).ToList(); 

小型ノート:新しいリスト(){... .. }は、LINQ2SQLがSQL文に変換できる構造ではないため、LINQクエリで使用することはできません。それがうまくいけば、AsEnumerable()が呼び出されたときに気づいたように、クエリをオブジェクトに変換している可能性があります。
そして新しいリスト(){ "A"、 "B" は}と同等である:

var list = new List<string>(); 
list.Add("A"); 
list.Add("B"); 

だから、( "" 位置0および "B" であるべきで宣言順序を保つべきであるべき位置1にある)。