2012-01-23 169 views
1

我有以下問題: 我從數據庫中選擇數據,並從表中的每個項目創建一個模型。 該模型包含一個列表,其中包含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不能翻譯字典,這就是爲什麼我使用了List。

+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秒頁面加載的差異。感興趣的人爲什麼:在.Where()之前使用.AsEnumerable()將整個表加載到內存中,然後執行where。這會導致更多的負載。更多信息:http://stackoverflow.com/questions/3311244/understanding-asenumerable-in-linq-to-sql – Mortana

+0

@Mortana,它是ToList加載內存中的所有數據,而不是AsEnumerable。 AsEnumerable的作用是將該表視爲IEnumerable而不是IQueryable,以便查詢的其餘部分在內存中逐行執行,而不是轉換爲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"); 

所以應該保留聲明順序( 「A」 應該是在位置0和 「B」 應在位置1)。

相關問題