以下查询已成功运作。
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]'。
我该怎么做才能获得预期的结果?
答案 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到对象的调用,就像它需要的那样。