我试图从我的EF Code First DB运行的LINQ选择中返回一组JSON格式的数据并收到错误
Count必须是DbConstantExpression或DbParameterReferenceExpression。参数名称:count
但我不知道为什么我得到它,因为我没有在我的LINQ查询中使用COUNT
参数,所以为什么我收到此错误?
public ActionResult GetData(string sidx, string sord, int page, int rows)
{
try
{
//Get total rows
int RowCount = db.Sections.Count();
string OrderBy = (sidx + " " + sord);
var SectionData = new
{
total = (int)Math.Ceiling((float)RowCount / (float)rows),
page = page,
records = RowCount,
rows = (from s in db.Sections
select new
{
id = s.ID,
cell = new string[] {
SqlFunctions.StringConvert((double)s.ID).Trim(),
s.RouteName,
s.Title
}
.OrderBy(x => sidx)
.Skip(page * rows)
.Take(rows)
}).ToArray()
};
return Json(SectionData, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
ErrorSignal.FromCurrentContext().Raise(ex);
return Json(null, JsonRequestBehavior.AllowGet);
}
}
我不太熟悉EF,但我确实遇到过old msdn post,有人报告了同样的错误。他们在.Skip()
中执行计算并修复它们,他们分别执行计算,并在其LINQ语句中使用结果。
首先尝试计算page * rows
,然后在LINQ语句中使用该结果:
var skipAmount = page * rows;
var SectionData = new
{
...
...
rows = (from s in db.Sections
select new
{
...
...
.OrderBy(x => sidx)
.Skip(skipAmount)
.Take(rows)
现在使用EF6,您可以在Skip和Take参数中使用lambda表达式,事实上最好这样做,因为SQL Query被缓存并在后续页面上重复使用:see this article
但您仍需要评估要传递的参数,如@Grant所做的那样。所以区别在于
.Skip(() => skipAmount
.Take(() => rows)