我使用linq填充列表<string>,但项目的顺序是随机的</string>

时间:2012-08-22 16:20:23

标签: linq

我有这个linq语法

var jsonData = new
            {
                total = 1,
                page = 1,
                records = per.Count(),
                rows = 
                           from r in per
                           select new
                           {
                               id = r.id,
                               cell = new List<string>()
                                  {
                                       SqlFunctions.StringConvert((double)  r.id),
                                       r.nombre,
                                       r.mail,
                                       r.documento
                                  }
                           }
            };

问题是cell属性中每个列表的值都是随机的项目顺序。

示例结果:

        item 1:  id:"         1"    string
        nombre:"Medina Teto"    string
        mail: "soyelteto@hotmail.com"   string
        dni:"DNI 12312322"  string
    item 2:
            dni:"DNI 12312872"  string
            mail:"elancho@hotmail.com"  string
            nombre: "Peuchele Ruben"    string
            id: "         2"    string

        item 3:
            id: "         3"    string
            nombre: "la momia Blanca"   string
            mail: "soylamomiabuena@hotmail.com" string
            dni: "DNI 45612322" string

第2项首先是dni,然后是邮件。其他项目首先是id,然后是名称

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:1)

不确定为什么会发生(虽然我认为List<T>中项目的枚举顺序不能保证稳定),但可以通过使用命名值来解决:

cell = new
{
    dni = SqlFunctions.StringConvert((double)  r.id),
    nombre = r.nombre,
    mail = r.mail,
    documento = r.documento
}

额外的好处:接收方更了解它正在处理什么。


编辑(在您发表评论后)

试试运气

cell = new SortedList<int,string>
{
    { 1, r.id.ToString() },
    { 2, r.nombre },
    { 3, r.mail },
    { 4, r.documento }
}

但是您必须首先转换为IEnumerable,EF不支持包含多个元素的列表初始值设定项。

答案 1 :(得分:0)

解决方案:

 var rows = per.AsEnumerable()
                        .Select(r => new
                           {
                               id = r.id,
                               cell = new[]
                                  {
                                       r.id.ToString(),
                                       r.nombre,
                                       r.mail,
                                       r.documento
                                  }
                           }).ToArray();

            var jsonData = new
            {
                total = 1,
                page = 1,
                records = per.Count(),
                rows
            };