2012-01-23 168 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)。

相关问题