计数错误但我在LINQ表达式中没有使用Count,

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计数错误但我在LINQ表达式中没有使用Count,相关的知识,希望对你有一定的参考价值。

我试图从我的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)

以上是关于计数错误但我在LINQ表达式中没有使用Count,的主要内容,如果未能解决你的问题,请参考以下文章

使用表达式方法的 LINQ 计数子句中的 if 条件

Linq 计数错误(列)

LINQ 以 Lambda 形式选择不同计数

Linq 得到条件计数

在剃刀视图上递增时出现编译错误

使用 Linq to Entities 在一次操作中获取 COUNT 和 SKIP TAKE