无法返回JsonResult

时间:2011-06-22 05:55:17

标签: asp.net linq asp.net-mvc-3

以下查询已成功运作。

var tabs = (
                from r in db.TabMasters
                orderby r.colID
                select new { r.colID, r.FirstName, r.LastName })
                .Skip(rows * (page - 1)).Take(rows);

现在我想将JsonResult返回为

var jsonData = new
            {
                total = (int)Math.Ceiling((float)totalRecords / (float)rows),
                page = page,
                records = totalRecords,
                rows = (from r in tabs
                        select new { id = r.colID, cell = new string[] { r.FirstName, r.LastName } }).ToArray()
            };
return Json(jsonData, JsonRequestBehavior.AllowGet);

但它会给我一个错误,如: 无法在查询结果中初始化数组类型'System.String []'。请考虑使用'System.Collections.Generic.List`1 [System.String]'。

我该怎么做才能获得预期的结果?

2 个答案:

答案 0 :(得分:8)

我怀疑它就像使用AsEnumerable()将最后一部分推入进程内查询一样简单:

var jsonData = new
{
    total = (int)Math.Ceiling((float)totalRecords / (float)rows),
    page = page,
    records = totalRecords,
    rows = (from r in tabs.AsEnumerable()
            select new { id = r.colID,
                         cell = new[] { r.FirstName, r.LastName } }
           ).ToArray()
};
return Json(jsonData, JsonRequestBehavior.AllowGet);

为清晰起见,您可能希望将该查询从匿名类型初始值设定项中提取出来:

var rows = tabs.AsEnumerable()
               .Select(r => new { id = r.colID,
                                  cell = new[] { r.FirstName, r.LastName })
               .ToArray();

var jsonData = new { 
    total = (int)Math.Ceiling((float)totalRecords / (float)rows),
    page,
    records = totalRecords,
    rows
};

答案 1 :(得分:1)

这是因为它增加了你的tabs IQueryable的LINQ查询。然后尝试将LINQ表达式转换为SQL查询,并且提供程序不支持投影数组。

您可以更改tabs变量的LINQ表达式的赋值,以使用ToList来实现DB结果,或者您可以将.AsEnumerable()添加到分配给rows字段的LINQ表达式中。您的JsonResult的匿名类型。 AsEnumerable会将IQueryable降级为IEnumerable,这将阻止您的第二个LINQ查询尝试添加到数据库查询中,并使其成为一个LINQ到对象的调用,就像它需要的那样。