none
Ayuda con Jqgrid y linq RRS feed

  • Pregunta

  • amigos estoy empezando con JGGRID y necesito mostrar registros de 3 tablas,  ya pude mostrar registros de 1 tabla pero ahora que tengo que hacer un inner join la verdad no se como pongo el codigo del controlador.

    public JsonResult GetValues(string sidx, string sord, int page, int rows)  //Gets the todo Lists.
            {
                int pageIndex = Convert.ToInt32(page) - 1;
                int pageSize = rows;
                var Licitacion = (from t1 in db.Licitacion
                                  join t2 in db.TipoCompra on t1.TIPOCOMPRAID equals t2.TIPOCOMPRAID
                                  join t3 in db.TipoEvento on t1.TIPOEVENTOID equals t3.TIPOEVENTOID
                                  orderby t1.LICITACIONID descending
                                  select t1);
                /*var Results = db.Licitacion.Select(
                        a => new
                        {
                            a.LICITACIONID,
                            a.EJERCICIO,
                            a.NOLICITACION,
                            a.DESCRIPCION,
                            a.PRECONVOCATORIA,
                            a.CONVOCATORIA,
                            a.JTAACLARACION,
                            a.APERTURAOFERTAS,
                            a.FALLO,
                            a.CONTRATOS,
    
                        });*/
                int totalRecords = Results.Count();
                var totalPages = (int)Math.Ceiling((float)totalRecords / (float)rows);
                if (sord.ToUpper() == "DESC")
                {
                    Results = Results.OrderByDescending(s => s.LICITACIONID);
                    Results = Results.Skip(pageIndex * pageSize).Take(pageSize);
                }
                else
                {
                    Results = Results.OrderBy(s => s.LICITACIONID);
                    Results = Results.Skip(pageIndex * pageSize).Take(pageSize);
                }
                var jsonData = new
                {
                    total = totalPages,
                    page,
                    records = totalRecords,
                    rows = Results
                };
                return Json(jsonData, JsonRequestBehavior.AllowGet);
            }

    estoy tratando de hacerlo asi.

    var Licitacion = (from t1 in db.Licitacion
                                  join t2 in db.TipoCompra on t1.TIPOCOMPRAID equals t2.TIPOCOMPRAID
                                  join t3 in db.TipoEvento on t1.TIPOEVENTOID equals t3.TIPOEVENTOID
                                  orderby t1.LICITACIONID descending
                                  select t1);

    pero no me funciona, agradeceria una ayuda.

    saludos


    Horacio Xochitemol Bautista

    domingo, 15 de mayo de 2016 3:39

Todas las respuestas

  • Hola,

    Pero no mencionas que campos quieres mostrar.

    Si quieres mostrar diferentes campos de las 3 tablas, puedes usar el new, además deberías poner un ToList(), ya que si tienes más de uno sería una lista.

     var Licitacion = (from t1 in db.Licitacion
                       join t2 in db.TipoCompra on t1.TIPOCOMPRAID equals t2.TIPOCOMPRAID
                       join t3 in db.TipoEvento on t1.TIPOEVENTOID equals t3.TIPOEVENTOID
                       orderby t1.LICITACIONID descending
                       select new { t1.miCampo, t2.miCampo, t3.miCampo }).ToList();

    Si no te ayuda, menciona que campos y de que tabla son las que tendría que mostrar.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    domingo, 15 de mayo de 2016 4:00
  • Gracias Amigo; te comento que quedo de la siguiente manera.

    var Results = (from t1 in db.Licitacion
                                  join t2 in db.TipoCompra on t1.TIPOCOMPRAID equals t2.TIPOCOMPRAID
                                  join t3 in db.TipoEvento on t1.TIPOEVENTOID equals t3.TIPOEVENTOID
                                  orderby t1.LICITACIONID descending
                                  select new { t1.LICITACIONID,t3.DESCRIPCIONCORTA,t1.EJERCICIO,t1.NOLICITACION,
                                      t1.DESCRIPCION,t1.PRECONVOCATORIA,t1.CONVOCATORIA,t1.JTAACLARACION,
                                      t1.APERTURAOFERTAS,t1.FALLO,t1.CONTRATOS });

    Horacio Xochitemol Bautista

    domingo, 15 de mayo de 2016 11:50
  • Hola Xochitemol,

    Te comparto algunas consideraciones:

    Primero, para obtener varios campos del conjunto de resultados haces uso de un tipo anónimo (tipo generado de manera dinámica), pero sólo citas los atributos de las variables de rango t1 y t3, ¿Cuál es la necesidad de combinar por la tabla [TipoCompra]? Si los atributos que muestras en el tipo anónimo (select) pertenecen sólo a las tablas [Licitacion] y [TipoEvento] entonces te recomiendo que retires a la tabla [TipoCompra] de la consulta.

    var Results = (from t1 in db.Licitacion                              
                                  join t3 in db.TipoEvento on t1.TIPOEVENTOID equals t3.TIPOEVENTOID
                                  orderby t1.LICITACIONID descending
                                  select new { t1.LICITACIONID,t3.DESCRIPCIONCORTA,t1.EJERCICIO,t1.NOLICITACION,
                                      t1.DESCRIPCION,t1.PRECONVOCATORIA,t1.CONVOCATORIA,t1.JTAACLARACION,
                                      t1.APERTURAOFERTAS,t1.FALLO,t1.CONTRATOS });

    Segundo, con LinQ debes de decidir en que momento se ejecuta la consulta. Es decir, el código que actualicé en el punto 1 no se ejecutará de manera inmediata contra la base de datos, debes de ser tú quien -en este caso- indiques la ejecución de la consulta. ¿Cómo? puedes hacer uso del método ToList() o ToArray(). Posterior a la ejecución los resultados se almacenan en memoria listos para ser utilizados u operados.

    var Results = (from t1 in db.Licitacion                              
                                  join t3 in db.TipoEvento on t1.TIPOEVENTOID equals t3.TIPOEVENTOID
                                  orderby t1.LICITACIONID descending
                                  select new { t1.LICITACIONID,t3.DESCRIPCIONCORTA,t1.EJERCICIO,t1.NOLICITACION,
                                      t1.DESCRIPCION,t1.PRECONVOCATORIA,t1.CONVOCATORIA,t1.JTAACLARACION,
                                      t1.APERTURAOFERTAS,t1.FALLO,t1.CONTRATOS }).ToList();

    Tercero, tiene que ver con el punto dos. Ejecutar una sentencia OrderBy contra la base de datos tiene un coste considerable, ello repercute en los tiempos de respuesta. Recuerda lo que te mencioné en el punto anterior: el método ToList() ejecuta la consulta de manera inmediata y pasa los datos a memoria, sugiero que el proceso de ordenamiento se haga sobre los datos en memoria, es posible que sea mas óptimo dependiendo de los recursos de RAM del equipo y de la cantidad de datos a procesar. Finalmente, la consulta quedaría de la siguiente manera:

    var Results = (from t1 in db.Licitacion                              
                                  join t3 in db.TipoEvento on t1.TIPOEVENTOID equals t3.TIPOEVENTOID
                                  select new { t1.LICITACIONID,t3.DESCRIPCIONCORTA,t1.EJERCICIO,t1.NOLICITACION,
                                      t1.DESCRIPCION,t1.PRECONVOCATORIA,t1.CONVOCATORIA,t1.JTAACLARACION,
                                      t1.APERTURAOFERTAS,t1.FALLO,t1.CONTRATOS }).ToList();

    Y al momento de asignar los datos puedes pasarlos ordenados:

    rows = Results.OrderByDescending(x => x.LICITACIONID)

    NOTA- valida si JqGrid expone mecanismos de ordenamiento (es un echo que sí), entonces deja en sus manos el proceso de ordenamiento, de seguro será mas performante.

    S.E.U.O. es todo cuanto puedo considerar.



    domingo, 15 de mayo de 2016 18:22
  • hola amigo de antemano muchas gracias por el apoyo y por los comentarios; te comento que esta la relación con las 3 tablas ya que en la edición necesito un campo de la tabla TipoCompra; por otro te doy las gracias porque estoy empezando con linq y  jqgrid,  te comento que hioce la modificacion de la consulta y la regreso a un list como lo comentas

    var Results = (from t1 in db.Licitacion                              
                                  join t3 in db.TipoEvento on t1.TIPOEVENTOID equals t3.TIPOEVENTOID
                                  orderby t1.LICITACIONID descending
                                  select new { t1.LICITACIONID,t3.DESCRIPCIONCORTA,t1.EJERCICIO,t1.NOLICITACION,
                                      t1.DESCRIPCION,t1.PRECONVOCATORIA,t1.CONVOCATORIA,t1.JTAACLARACION,
                                      t1.APERTURAOFERTAS,t1.FALLO,t1.CONTRATOS }).ToList();

     y la verdad si se ve el resultado en la carga de datos.

    ahora bien cuando quiero hacer la paginacion en el jqgrid  no encuentro  como hacerlo.

    podrías echarme la mano, te paso el código del controlador.

    public JsonResult GetValues(string sidx, string sord, int page, int rows)  
            {
                int pageIndex = Convert.ToInt32(page) - 1;
                int pageSize = rows;
                var Results = (from t1 in db.Licitacion
                               join t3 in db.TipoEvento on t1.TIPOEVENTOID equals t3.TIPOEVENTOID                           
                               select new
                               {
                                   t1.LICITACIONID,
                                   t3.DESCRIPCIONCORTA,
                                   t1.EJERCICIO,
                                   t1.NOLICITACION,
                                   t1.DESCRIPCION,
                                   t1.PRECONVOCATORIA,
                                   t1.CONVOCATORIA,
                                   t1.JTAACLARACION,
                                   t1.APERTURAOFERTAS,
                                   t1.FALLO,
                                   t1.CONTRATOS
                               }).ToArray();
    
                int totalRecords = Results.Count();
                var totalPages = (int)Math.Ceiling((float)totalRecords / (float)rows);
    
                if (sord.ToUpper() == "DESCRIPCION")
                {
                    Results = Results.OrderByDescending(s => s.LICITACIONID);
                    Results = Results.Skip(pageIndex * pageSize).Take(pageSize);
                }
                //else
                //{
                //     Results = Results.OrderBy(s => s.LICITACIONID);
                //    Results = Results.Skip(pageIndex * pageSize).Take(pageSize);
                //}
    
                var jsonData = new
                {
                    total = totalPages,
                    page,
                    records = totalRecords,                
                    //rows = Results
                    rows = Results.OrderByDescending(x => x.LICITACIONID)
                };
               return Json(jsonData, JsonRequestBehavior.AllowGet);
            }

    en esta linea  me manda un error.

    if (sord.ToUpper() == "DESCRIPCION")
                {
                    Results = Results.OrderByDescending(s => s.LICITACIONID);
                    Results = Results.Skip(pageIndex * pageSize).Take(pageSize);
                }

    Error 3 No se puede convertir implícitamente el tipo 'System.Collections.Generic.IEnumerable<AnonymousType#1>' en 'AnonymousType#1[]' C:\Users\horacio.xochitemol\Source\Repos\SISTEMADBT\SISTEMADBT\Controllers\LicitacionsController.cs 225 27 SISTEMADBT

    podrias echarme una mano. gracias


    Horacio Xochitemol Bautista


    • Editado Xochitemol lunes, 16 de mayo de 2016 15:57 complemento
    lunes, 16 de mayo de 2016 15:51
  • amigo ya hice las modificaciones 

    public JsonResult GetValues(string sidx, string sord, int page, int rows)  
            {
                int pageIndex = Convert.ToInt32(page) - 1;
                int pageSize = rows;
                int totalRecords = db.Licitacion.Count();
                int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);
    
                var Licitacion = db.Licitacion.OrderBy(sidx + " " + sord).Skip(pageIndex * pageSize).Take(pageSize);
               
    
                var jsonData = new
                {
                    total = totalPages,
                    page,
                    records = totalRecords,
                    rows = (from t1 in db.Licitacion
                               join t3 in db.TipoEvento
                               on t1.TIPOEVENTOID equals t3.TIPOEVENTOID                                                     
                        select new
                        {
                            id = t1.LICITACIONID,
                            cell = new string[] { 
                                t1.EJERCICIO.ToString(),                            
                                t3.DESCRIPCIONCORTA.ToString(),
                                t1.NOLICITACION.ToString(),
                                t1.DESCRIPCION.ToString(),
                                t1.PRECONVOCATORIA.ToString(),
                                t1.CONVOCATORIA.ToString(), 
                                t1.JTAACLARACION.ToString(),
                                t1.APERTURAOFERTAS.ToString(),
                                t1.FALLO.ToString(),
                                t1.CONTRATOS.ToString()
                                 }
                        }).ToList()
                };
               return Json(jsonData, JsonRequestBehavior.AllowGet);
            }

    pero me manda el siguiente error.

    Error 2 Los argumentos de tipo para el método 'System.Linq.Queryable.OrderBy<TSource,TKey>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,TKey>>)' no se pueden inferir a partir del uso. Intente especificar los argumentos de tipo explícitamente. C:\Users\horacio.xochitemol\Source\Repos\SISTEMADBT\SISTEMADBT\Controllers\LicitacionsController.cs 205 30 SISTEMADBT

    en la siguiente linea

    var Licitacion = db.Licitacion.OrderBy(sidx + " " + sord).Skip(pageIndex * pageSize).Take(pageSize);

    podrían echarme una mano, muchas gracias.


    Horacio Xochitemol Bautista

    lunes, 16 de mayo de 2016 22:39
  • Amigo ya hice cambios en en controlador pero no he pódido hacer la paginacion podrian echarme una mano.

     public JsonResult GetValues(string sidx, string sord, int page, int rows)  
            {
                var Licitac = (from t1 in db.Licitacion
                               join t3 in db.TipoEvento on t1.TIPOEVENTOID equals t3.TIPOEVENTOID
                               select new
                               {
                                   t1.LICITACIONID,
                                   t3.DESCRIPCIONCORTA,
                                   t1.EJERCICIO,
                                   t1.NOLICITACION,
                                   t1.DESCRIPCION,
                                   t1.PRECONVOCATORIA,
                                   t1.CONVOCATORIA,
                                   t1.JTAACLARACION,
                                   t1.APERTURAOFERTAS,
                                   t1.FALLO,
                                   t1.CONTRATOS
                               });
                    //db.Licitacion;
                int pageIndex = Convert.ToInt32(page) - 1;
                int pageSize = rows;
                int totalRecords = db.Licitacion.Count();
                int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);
    
                //var Licitacion = db.Licitacion.ToList().OrderBy(sidx + " " + sord).Skip(pageIndex * pageSize).Take(pageSize);
                //var Licitacion = db.Licitacion.OrderBy(sidx + "" + sord).Skip(pageIndex * pageSize).Take((pageSize);
               
    
                var jsonData = new
                {
                    total = totalPages,
                    page,
                    records = totalRecords,
                    rows = Licitac.Select(x => new
                    {
                        x.LICITACIONID,
                        x.EJERCICIO,
                        x.DESCRIPCIONCORTA,
                        x.NOLICITACION,
                        x.DESCRIPCION
                    }).ToArray()                
                };
               return Json(jsonData, JsonRequestBehavior.AllowGet);
            }

    en estas lineas es donde no se como paginas.

     //var Licitacion = db.Licitacion.ToList().OrderBy(sidx + " " + sord).Skip(pageIndex * pageSize).Take(pageSize);
                //var Licitacion = db.Licitacion.OrderBy(sidx + "" + sord).Skip(pageIndex * pageSize).Take((pageSize);

    Agradecería su apoyo 


    Horacio Xochitemol Bautista

    miércoles, 18 de mayo de 2016 18:13
  • Amigos de verdad agradecería su  ayuda con la paginación en jqgrid, llevo dias sin poder lograr que funcione

    este es el código de mi controlador

    public JsonResult GetValues(string sidx, string sord, int page, int rows)  
            {               
                
                //primer intento de Actualizacion de datos
                int pageIndex = Convert.ToInt32(page) - 1;
                int pageSize = rows;
                int totalRecords = db.Licitacion.Count();
                int totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);
    
    
                
                var Licitac = (from Licitaciones in db.Licitacion
                                .Skip(pageIndex * pageSize)
                                .Take(pageSize)
                                select Licitaciones).OrderBy(d => d.LICITACIONID);
    
                   
                    
                var jsonData = new
                {
                    total = totalPages, 
                    page = page,
                    records = totalRecords, 
                    rows = (
                               from Resultado in Licitac
                               select new
                               {
                                   LICITACIONID = Resultado.LICITACIONID,
                                   cell = new string[] {
                                        Resultado.LICITACIONID.ToString(),
                                       // produto.ProductName.ToString(),
                                        //produto.SupplierID.ToString(),
                                       // produto.CategoryID.ToString(),
                                       // produto.QuantityPerUnit.ToString(),
                                       // produto.UnitPrice.ToString(),
                                       // produto.UnitsInStock.ToString(),
                                       // produto.UnitsOnOrder.ToString(),
                                       // produto.ReorderLevel.ToString(),
                                        Resultado.EJERCICIO.ToString()
                                }
                               }).ToArray()
                   
                };
     return Json(jsonData, JsonRequestBehavior.AllowGet);           
            }

    la paginacion ya la intente asi.

     var Licitac = (from Licitaciones in db.Licitacion                            
                               select Licitaciones);
    
                Licitac = Licitac.OrderByDescending(s => s.LICITACIONID);
                Licitac = Licitac.Skip(pageIndex * pageSize).Take(pageSize);


    y asi

     var Licitac = (from Licitaciones in db.Licitacion
                                .Skip(pageIndex * pageSize)
                                .Take(pageSize)
                                select Licitaciones).OrderBy(d => d.LICITACIONID);
    

    pero en esta ultima me manda el siguiente mensaje.

    "El método 'Skip' solo se admite para entradas ordenadas en LINQ to Entities. Se debe llamar antes al método 'OrderBy' que al método 'Skip'."

    de verdad agradecería su ayuda


    Horacio Xochitemol Bautista

    viernes, 20 de mayo de 2016 19:31