C# Cout错误,但我在LINQ EXPRESSION中未使用Count,

C# Cout错误,但我在LINQ EXPRESSION中未使用Count,,c#,linq-to-entities,asp.net-mvc-5,entity-framework-6,C#,Linq To Entities,Asp.net Mvc 5,Entity Framework 6,我试图从针对EF Code First DB运行的LINQ select返回一组JSON格式的数据,但得到了错误 计数必须是DbConstantExpression或DbParameterReferenceExpression。参数名称:count 但我不确定为什么会得到它,因为我没有在LINQ查询中使用COUNT参数,所以为什么会得到这个错误 public ActionResult GetData(string sidx, string sord, int page, int rows

我试图从针对EF Code First DB运行的LINQ select返回一组JSON格式的数据,但得到了错误

计数必须是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不太熟悉,但我确实遇到了一个有人报告了相同的错误的例子。他们在
.Skip()
中执行计算,为了解决这个问题,他们单独执行了计算,并在LINQ语句中使用了结果

首先尝试计算
page*行
,然后在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查询会被缓存并在后续页面上重复使用:

但是您仍然需要像@Grant那样计算参数才能通过。所以区别在于

.Skip(() => skipAmount
.Take(() => rows)

你用RowCount来计算总数……我认为这不是问题,但它确实可以计算。是的,这就是问题所在。制作了一个名为“SkipCount”的新变量来进行计算,并将其放入
Skip()
中,它就工作了。谢谢