JSON结果的返回顺序与预期不同

JSON结果的返回顺序与预期不同,json,asp.net-mvc-2,linq-to-entities,jqgrid,dynamic-linq,Json,Asp.net Mvc 2,Linq To Entities,Jqgrid,Dynamic Linq,我跟在后面。我有它的工作,它工作得很好…除了一个小问题。当我按照ID以外的其他方式对列进行排序时,从服务器返回的JSON数据是非常……嗯……错误的。这是我的控制器方法 [HttpPost] public ActionResult PeopleData(string sidx, string sord, int page, int rows) { int pageIndex = Convert.ToInt32(page) - 1; int pageSize = rows;

我跟在后面。我有它的工作,它工作得很好…除了一个小问题。当我按照ID以外的其他方式对列进行排序时,从服务器返回的JSON数据是非常……嗯……错误的。这是我的控制器方法

[HttpPost]
public ActionResult PeopleData(string sidx, string sord, int page, int rows)
{
    int pageIndex = Convert.ToInt32(page) - 1;
    int pageSize = rows;
    int totalRecords = repository.FindAllPeople().Count();
    int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);

    var people = repository.FindAllPeople()
        .OrderBy(sidx + " " + sord)
        .Skip(pageIndex * pageSize)
        .Take(pageSize);

    var jsonData = new
    {
        total = totalPages,
        page = page,
        records = totalRecords,
        rows = (
            from person in people
            select new
            {
                i = person.PersonID,
                cell = new List<string> { SqlFunctions.StringConvert((double) person.PersonID), person.PersonName }
            }
        ).ToArray()
    };

    return Json(jsonData);
}
但是,当我按PersonName排序时,每隔一行都会翻转顺序(ID与名称)。因此,当我在表中显示它时,PersonName在ID列中,ID在person列中。下面是JSON结果

{"total":1,"page":1,"records":6,"rows":[{"i":5,"cell":[" 5","Five"]},{"i":4,"cell":["Four","    4"]},{"i":1,"cell":["         1","One"]},{"i":6,"cell":["Six","      6"]},{"i":3,"cell":["         3","Three"]},{"i":2,"cell":["Two","    2"]}]}
有人知道我做错了什么导致了这一切吗

更新

因此,我了解到,现在发生的情况是,数组中的每一项的数组值都在翻转。例如,如果我用以下内容填充数据库:

[甲、乙、丙]

然后,对于每个偶数结果(如果从0开始计数,则为奇数),我的数据将返回:

[C、B、A]

因此,最终,我的JSON行数据类似于:

[甲、乙、丙] [C、B、A] [甲、乙、丙] [C、B、A] …等等


这总是在发生,而且总是始终如一。我想弄清楚到底发生了什么,这让我有点疯狂,因为它看起来应该很简单。

尝试使用所描述的方法。如果您在
repository.FindAllPeople()
中使用字段而不是属性,那么您应该查看代码的注释部分,其中使用了
FieldInfo
GetField
,而不是
PropertyInfo
GetProperty

我的INT型数据也有同样的问题。 如果我的队列中的元素(A、B、C)是NVARCHAR类型,我就没有这个问题。
所以问题显然出在SqlFunction.StringConvert函数中。

我在这里找到了解决方案:

问题最终源于LINQtoEntities在处理字符串时遇到问题这一事实。当我使用SqlFunctions.StringConvert方法时,这不正确地执行了转换(尽管,我必须承认,我不完全理解为什么会切换顺序)

在这两种情况下,根据上面的文章,解决问题的方法是在本地进行选择,这样我就可以“强制”Linq到实体正确地处理字符串。由此,我的最终代码是:

var people = repository.FindAllPeople()
             .OrderBy(sidx + " " + sord)
             .Skip(pageIndex * pageSize)
             .Take(pageSize);

// Due to a problem with Linq to Entities working with strings,
// all string work has to be done locally.
var local = people.AsEnumerable();
var rowData = local.Select(person => new
        {
            id = person.PersonID,
            cell = new List<string> { 
                person.PersonID.ToString(),
                person.PersonName
            }
        }
    ).ToArray();

var jsonData = new
{
    total = totalPages,
    page = page,
    records = totalRecords,
    rows = rowData
};

return Json(jsonData);
var people=repository.FindAllPeople()
.OrderBy(sidx+“”+sord)
.Skip(页面索引*页面大小)
。取(页面大小);
//由于使用字符串的Linq to实体存在问题,
//所有管柱工作必须在本地完成。
var local=people.AsEnumerable();
var rowData=local.Select(person=>new
{
id=person.PersonID,
单元格=新列表{
person.PersonID.ToString(),
person.PersonName
}
}
).ToArray();
var jsonData=new
{
总计=总页数,
第页,
记录=总记录,
行=行数据
};
返回Json(jsonData);

谢谢,但这似乎并不能解决问题。(我可能做错了什么,但我无法让它工作。)有趣的是,我的数据错误是一致的。例如:([1,1],[2,2],[3,3],[4,4])。名称/数字每隔一个就翻转一次。@JasCav:您能包含类的定义吗?该类具有
PersonID
属性?此外,我无法从您的代码中理解为什么您使用
var scenarios=repository.FindAllPeople()…
,然后在**people**
people
而不是
scenarios
)中使用
?您还应该将
i=person.PersonID
替换为
id=person.PersonID
。目前,
i
将被忽略,而as
id
将使用整数,如1,2,3…在场景和人物中键入。修正了。我还改为
id=person.PersonID
,尽管这似乎没什么区别。至于包含PersonID的类,它是“Person”类型,并且是使用LINQtoEntities(EF4)生成的。PersonID恰好是数据库中的一个整数(自增键)。@JasCav:从您的评论中,我不知道问题是否已解决。关于
PersonID
我只想知道它是否是类的字段的属性。在从场景到人物的所有更改之后,您是否尝试过从中进行排序?从场景到人物只是一个输入错误。这在我的代码中不是问题。PersonID是Person类中的一个属性(整数)。(同样,我不处理这段代码——它完全是由实体框架生成的。)您非常接近正确的答案(这最终让我找到了正确的答案)。请参阅我的回复以了解最终解决方案。我会给你一个+1来帮助我,但是,作为一个钢人队的球迷,我不能哈哈…开玩笑而已+1.谢谢你的洞察力!
var people = repository.FindAllPeople()
             .OrderBy(sidx + " " + sord)
             .Skip(pageIndex * pageSize)
             .Take(pageSize);

// Due to a problem with Linq to Entities working with strings,
// all string work has to be done locally.
var local = people.AsEnumerable();
var rowData = local.Select(person => new
        {
            id = person.PersonID,
            cell = new List<string> { 
                person.PersonID.ToString(),
                person.PersonName
            }
        }
    ).ToArray();

var jsonData = new
{
    total = totalPages,
    page = page,
    records = totalRecords,
    rows = rowData
};

return Json(jsonData);