2011-06-22 25 views
6

La siguiente consulta funciona correctamente.No se pudo devolver JsonResult

var tabs = (
       from r in db.TabMasters 
       orderby r.colID 
       select new { r.colID, r.FirstName, r.LastName }) 
       .Skip(rows * (page - 1)).Take(rows); 

Ahora quieren volver JsonResult como como

var jsonData = new 
      { 
       total = (int)Math.Ceiling((float)totalRecords/(float)rows), 
       page = page, 
       records = totalRecords, 
       rows = (from r in tabs 
         select new { id = r.colID, cell = new string[] { r.FirstName, r.LastName } }).ToArray() 
      }; 
return Json(jsonData, JsonRequestBehavior.AllowGet); 

Pero lo hará me da un error como: El tipo array 'System.String []' no puede ser inicializado en un resultado de la consulta . Considere usar 'System.Collections.Generic.List`1 [System.String]' en su lugar.

¿Qué debo hacer para obtener el resultado esperado?

Respuesta

8

sospecho que es tan simple como pulsar la última parte en una consulta durante el proceso usando AsEnumerable():

var jsonData = new 
{ 
    total = (int)Math.Ceiling((float)totalRecords/(float)rows), 
    page = page, 
    records = totalRecords, 
    rows = (from r in tabs.AsEnumerable() 
      select new { id = r.colID, 
         cell = new[] { r.FirstName, r.LastName } } 
      ).ToArray() 
}; 
return Json(jsonData, JsonRequestBehavior.AllowGet); 

es posible que desee para tirar de esa consulta fuera del inicializador de tipo anónimo, para mayor claridad:

var rows = tabs.AsEnumerable() 
       .Select(r => new { id = r.colID, 
            cell = new[] { r.FirstName, r.LastName }) 
       .ToArray(); 

var jsonData = new { 
    total = (int)Math.Ceiling((float)totalRecords/(float)rows), 
    page, 
    records = totalRecords, 
    rows 
}; 
+1

Excelente solución ...! – imdadhusen

+0

cómo utilizar OrderBy es SIDX y OrderType se SORD en siguiente consulta 'lengüetas var = ( de r en db.TabMasters orderby r.colID seleccione nuevas {r.colID, r.FirstName, r.LastName}) . Omitir (filas * (página - 1)). Tomar (filas); ' ** Quisiera reemplazar orderby r.colID por sidx y por descender o '' ** – imdadhusen

+0

@imdadhusen: No es realmente obvio a qué se refiere , pero parece que sería mejor preguntarlo por separado. –

1

Es porque se está agregando a la consulta LINQ que es su IQueryable tabs. Eso está tratando de convertir la expresión LINQ en una consulta SQL y el proveedor no admite la proyección de matrices.

Puede cambiar la asignación de la expresión LINQ de la variable de pestañas para usar ToList para materializar los resultados de la base de datos en ese momento, o puede agregar .AsEnumerable() a la expresión LINQ asignada al campo rows del tipo anónimo ese es tu JsonResult. AsEnumerable rebajará la IQueryable a IEnumerable, lo que evitará que su segunda consulta LINQ intente agregarse a la consulta DB y solo hará una llamada LINQ-to-objects como debe ser.

Cuestiones relacionadas