Ошибка в Cout, но я не использую Count в моем выражении LINQ,

asp.net-mvc-5 c# entity-framework-6 linq-to-entities

Вопрос

Я пытаюсь вернуть набор данных в форме JSON из LINQ select, запущенного против моего EF Code First DB, и я получаю ошибку

Счет должен быть выражением DbConstantExpression или DbParameterReferenceExpression. Имя параметра: count

но я не уверен, почему я получаю его, поскольку я не использую параметр COUNT в моем запросе LINQ, так почему я получаю эту ошибку?

    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, но я столкнулся с старым сообщением msdn, где кто-то сообщал об этой же ошибке. Они выполняли вычисления внутри .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, и на самом деле лучше сделать это, поскольку SQL Query кэшируется и повторно используется на последующих страницах: см. Эту статью

Но вам все равно нужно оценить параметр, который будет передан как @Grant. Поэтому разница

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



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему