Ошибка «невозможно инициализировать в результате запроса» при попытке получить данные с помощью Linq - PullRequest
2 голосов
/ 03 марта 2012

ВЫПУСК:

У меня есть приложение asp.net mvc 3.Я использую EF 4.1 и пробую jqGrid.Я пытаюсь получить данные для моего jqGrid, используя метод GridData ниже.Я получаю следующую ошибку для группы данных, начиная с 'var jsonData = new ...'.Любые идеи?

ОШИБКА:

{"Тип массива 'System.String []' не может быть инициализирован в результате запроса. Попробуйте использовать 'System.Collections.Generic.List`1 [System.String] 'вместо. "}

Метод GridData:

    public JsonResult GridData(string sidx, string sord, int page, int rows)
    {                        
        var result = from a in db.t_harvest_statistics_elk
                     where a.year == "2008" && a.unit_number == 1
                     orderby a.id
                     select a;


        int pageIndex = Convert.ToInt32(page) - 1;
        int pageSize = rows;
        int totalRecords = result.Count();   // context.Questions.Count();
        int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);

        var questions = result.Skip(pageIndex * pageSize).Take(pageSize);

        var jsonData = new
        {
            total = totalPages,
            page,
            records = totalRecords,
            rows = (
                from question in questions
                select new
                {
                    i = question.id,                                                
                    cell = new string[] { SqlFunctions.StringConvert((double)question.id), SqlFunctions.StringConvert((double)question.total_rec_days), question.year }

                }).ToArray()
        };

        return Json(jsonData);
    }

Вот пример, который работает

public JsonResult DynamicGridData(string sidx, string sord, int page, int rows)
    {
        var context = new HaackOverflowDataContext();
        int pageIndex = Convert.ToInt32(page) - 1;
        int pageSize = rows;
        int totalRecords = context.Questions.Count();
        int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);

        var questions = context.Questions.OrderBy(sidx + " " + sord).Skip(pageIndex * pageSize).Take(pageSize);

        var jsonData = new
        {
            total = totalPages,
            page,
            records = totalRecords,
            rows = (
                from question in questions
                select new
                {
                    i = question.Id,
                    cell = new string[] { question.Id.ToString(), question.Votes.ToString(), question.Title }
                }).ToArray()
        };
        return Json(jsonData);
    }

Ответы [ 4 ]

1 голос
/ 16 мая 2012
var jsonData = new {
    total = totalPages,
    page,
    records = totalRecords,
    rows = (
        from question in queryDetails
        select new
        {
            id = question.Id,
            cell = new IComparable[]{

                question.Id.ToString(),
                question.total_rec_days.ToString(),
                question.year.ToString()
            }
        }).ToArray()
};
return Json(jsonData, JsonRequestBehavior.AllowGet);
1 голос
/ 03 марта 2012

Самый простой способ исправить код будет использовать что-то вроде следующего

// to be able to use ToString() below which is NOT exist in the LINQ to Entity
// so we should get the data from the database and save the result locally before
// the next step. One can use .ToList() or to .AsEnumerable(), but one should
// choose only the fields of questions which we will need later
var queryDetails = (from item in questions
                    select new { item.id, item.total_rec_days, item.year }).ToList();
var jsonData = new {
        total = totalPages,
        page,
        records = totalRecords,
        rows = (
            from question in queryDetails
            select new
            {
                id = question.Id,
                cell = new [] {
                    question.Id.ToString(),
                    question.total_rec_days.ToString(),
                    question.year.ToString()
                }
            }).ToArray()
    };
return Json(jsonData, JsonRequestBehavior.AllowGet);

Ваш текущий код содержит некоторые небольшие проблемы, такие как i = question.id вместо id = question.id.

Я бы порекомендовал вам прочитать ответ и загрузить демонстрационную версию из ответа , которая содержит более свежий и расширенный код.

0 голосов
/ 04 марта 2012

Вы не можете использовать пользовательские функции внутри прямых запросов к вашей базе данных. Вместо этого вы можете сделать что-то вроде этого:

rows = questions.AsEnumerable() 
//or select just that you want  questions.Select(q=> new {g.Id, q.Votes,q.Title})
       .Select(p=> new {
                         id = p.Id,
                         cell = new string[] { SqlFunctions.StringConvert((double)p.id), SqlFunctions.StringConvert((double)p.total_rec_days), p.year }
                }).ToArray()

Это должно сработать.

0 голосов
/ 03 марта 2012

Можете ли вы попробовать изменить свой код следующим образом:

rows = ( 
                from question in questions.AsEnumerable() //AsEnumerable() is added to switch to LINQ to Entites to eager load the data.
                select new 
                { 
                    i = question.id,                                                 
                    cell = new string[] { SqlFunctions.StringConvert((double)question.id), SqlFunctions.StringConvert((double)question.total_rec_days), question.year } 

                }).ToArray() 

Поскольку MSDN говорит, что: «Вы не можете вызвать эту функцию напрямую. Эта функция может появляться только в LINQ to Entitiesзапрос «.(Хотя следующая строка немного запутана в документации)

...