none
como inicializar una variable para resultados de LINQ RRS feed

  • Pregunta

  • Holas,

    Mi consulta es que quiero inicializar una variable que llena una lista de datos y deacuerdo a mi parametro codigo si esta vacio o no hacer una consulta diferente sin embargo, me sale error al inicializar la variable, por favor alguien tiene alguna idea. Gracias


    • Editado unseo viernes, 17 de noviembre de 2017 16:13 falto imagen
    viernes, 17 de noviembre de 2017 16:08

Todas las respuestas

  • hola

    no puedes retornar un anonimo como respuesta del linq, veras que todoListResults es del tipo postulante, por lo que deberias usar

    todoListResults  = db.postulante.Select(a=> new postulante() { ...

    define la clase y no solo el new

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 17 de noviembre de 2017 16:17
  • Gracias, probare
    viernes, 17 de noviembre de 2017 16:25
  • Buenas,

    Aparte de lo que te dice Leandro, otra cosa,

    Supongo que tu objeto db es un modelo de EntityFramework, por lo tanto, estas accediendo a la base de datos directamente. Si estoy en lo cierto, al hacer Select().Where(), lo que estas haciendo es primero leer toda la tabla, cargarla en memoria, y después le estas haciendo el where. 

    Aunque en SQL, el where va al final, cuando usas LinQ con sintaxis de métodos, se ejecutan de izquierda a derecha, es decir, primero el select, después el where, por tanto, te recomendaría que cambies el orden, primero el where para filtrar, y después el select para obtener los datos filtrados previamente.

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    viernes, 17 de noviembre de 2017 16:31
  • Leandro, eh puesto como me indicas me sale otro mensaje, Jorge un ejemplo de lo que comentas.
    viernes, 17 de noviembre de 2017 16:42
  • public JsonResult GetTodoLists_postulante(..., string codigo)
    {
    	using (var ctx = new ProyectoContext())
    	{
    		ctx.Configuration...;
    		int pageIndex = ...;
    		int pageSize = ...;
    
    		var todoListResults = db.postulante().Where(x => x.codigo == codigo || codigo == null);	
    		
    		return Json(todoListResults.ToList(), JsonRequestBehavior.AllowGet);
    	}
    }

    viernes, 17 de noviembre de 2017 16:43
  • Vale,

    Tu tienes

    db.Select(....).Where(...);

    lo que deberia ser es al reves:

    db.Where(....).Select(...);

    Por otro lado, dentro del new, tienes que poner el nombre de cada campo delante:

    todoListResults = db.postulante.Where(z=>z.codigo == codigo).Select(a => new postulante()
    {
        tipo = a.tipo,
        nombre = a.nombre,
        apellidos = a.apellidos,
        etc...
    });

    es posible que aparte de todo esto, es posible que tengas que añadir AsQueryable() al final:

    todoListResults = db.postulante.Where(z=>z.codigo == codigo).Select(a => new postulante()
    {
        tipo = a.tipo,
        nombre = a.nombre,
        apellidos = a.apellidos,
        etc...
    }).AsQueryable();

    Haz los cambios y nos comentas

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:





    viernes, 17 de noviembre de 2017 16:44
  • Holas, Williams, la idea de la consulta, es cuando llega null me muestre todos los registros, si el codigo no esta vacio me muestra sus filas. Gracias.
    viernes, 17 de noviembre de 2017 16:54
  • ...la idea de la consulta, es cuando llega null me muestre todos los registros, si el código no esta vació me muestra sus filas. 

    Claro, es así como lo he entendido:

    var todoListResults = db.postulante().Where(x => x.codigo == codigo || codigo == null);	
    

    O si lo prefieres:

    var todoListResults = db.postulante();
    
    if (codigo != null) todoListResults.Where(x => x.codigo == codigo);

    • Propuesto como respuesta Jorge TurradoMVP viernes, 17 de noviembre de 2017 17:03
    viernes, 17 de noviembre de 2017 17:02
  • Gracias Williams voy a probar.

    Jorge he intentado y me sale este mensaje, lo que pasa es que uso los datos para llenar un jqgrid.

    viernes, 17 de noviembre de 2017 17:08
  • tienes que asignar las propiedades de la clase

    todoListResults  = db.postulante.Select(a=> new postulante() {

    tipo = a.tipo,

    nombre = a.nombre,

    .

    .

    igual ojo porque ese postulante es la clase del model no de EF

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    viernes, 17 de noviembre de 2017 17:19
  • asi lo hice, Leandro, gracias. Ahora tengo este mensaje.

    viernes, 17 de noviembre de 2017 17:20
  • porque quitaste el where en la query ? sino filtras por nada estas recuperando todos los registros

    si querias sabes cuentoas tienes es mas simple usar

    int total - db.postulante.Count();

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 17 de noviembre de 2017 17:23
  • El where esta arriba, lo que pasa en la imagen no se ve, por favor alguna sugerencia y si uso el:

    int total - db.postulante.Count();

    no tendria la paginación para el jqgrid.

    viernes, 17 de noviembre de 2017 17:53
  • Williams, cuando el codigo va hacer null me tiene que retornar toda la tabla, emcambio ahi buscara los codigo con null y no va mostrar ningun resultado, y eso es lo que no se quiere, sin embargo he probado tu codigo y si me salio una parte, pero como hacer para que me retorne todo cuando el codigo es null. Dejo el codigo que me funciono.

    IQueryable < postulante > todoListsResults = Enumerable.Empty<postulante>().AsQueryable();
    
    if (codigo != null) { todoListsResults.Where(x => x.codigo); }

    viernes, 17 de noviembre de 2017 17:57
  • IQueryable < postulante > todoListsResults = Enumerable.Empty<postulante>().AsQueryable();
    
    //Recuperar todos los datos
    var todoListResults = db.postulante();
    
    //Agregar la expresión de filtro en caso la variable 'codigo' no sea null
    if (codigo != null) todoListResults.Where(x => x.codigo == codigo);

    La consulta no se ejecutará en ninguna de las dos instrucciones, la ejecución se aplaza hasta llamar al método, por ejemplo, ToList().

    var jsonData = new {
            //...
            rows = todoListResults.ToList() //La consulta se ejecutará con/sin la cláusula WHERE
    }

    Por otro lado, si retornas una colección de tipo 'postulante' no veo la necesidad de indicar explicitamente la lista de selección. 

    viernes, 17 de noviembre de 2017 18:11
  • Hola Williams eh probado como indicastes y tengo este mensaje.

    • Editado unseo viernes, 17 de noviembre de 2017 20:53 me confundi de imagen
    viernes, 17 de noviembre de 2017 20:48
  • porque haces que todoListsResults sea un IQueryable<> ? porque no solo un List<>

    de esta forma podrias hacer que

    var todoListsResults = db.postulante.Where(z=> ((codigo != null) && (z.codigo == codigo)) )
    .Select(a=> new postulante() {
    
       ...
    
    }).ToList();


    asi ya no necesitas realizar el if si el codigo es nulo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 17 de noviembre de 2017 21:03
  • //Recuperar todos los datos var todoListResults = db.postulante().Select(p => new Postulante() { p.id_postulante, //Lista de selección }); //Agregar la expresión de filtro en caso la variable 'codigo' no sea null if (codigo != null) todoListResults.Where(x => x.codigo == codigo);

    var jsonData = new { //... rows = todoListResults.ToList() //La consulta se ejecutará con/sin la cláusula WHERE }


    viernes, 17 de noviembre de 2017 22:58
  • Holas, Williams, lo puse asi,Gracias por la ayuda,

     public JsonResult GetTodoLists_postulante(JqGrid jqgrid, string sidx, string sord, int page, int rows, string codigo="0")  //Gets the todo Lists.
            {
                using (var ctx = new ProyectoContext())
                {
                    ctx.Configuration.LazyLoadingEnabled = false;

                    int pageIndex = Convert.ToInt32(page) - 1;
                    int pageSize = rows;

                    //Recuperar todos los datos
                   // var todoListsResults = db.postulante();
                    var todoListsResults = db.postulante.Select(
                              a => new
                              {
                                  a.id_postulante,
                                  a.tipo,
                                  a.nombre,
                                  a.apellidos,
                                  a.correo,
                                  a.profesion,
                                  a.cv,
                                  a.fecha_nac,
                                  a.uni_ins,
                                  a.direccion,
                                  a.codigo,
                                  a.fecha
                              });
                    //Agregar la expresión de filtro en caso la variable 'codigo' no sea null
                    if (codigo != "")
                    { 
                       todoListsResults = db.postulante.Select(
                               a => new {
                                   a.id_postulante,
                                   a.tipo,
                                   a.nombre,
                                   a.apellidos,
                                   a.correo,
                                   a.profesion,
                                   a.cv,
                                   a.fecha_nac,
                                   a.uni_ins,
                                   a.direccion,
                                   a.codigo,
                                   a.fecha
                               }).Where(z => z.codigo == codigo);
                    }

                    int totalRecords = todoListsResults.Count();
                     var totalPages = (int)Math.Ceiling((float)totalRecords / (float)rows);

                     /*---*/
                    if (sord.ToUpper() == "ASC")
                    {
                        todoListsResults = todoListsResults.OrderByDescending(s => s.id_postulante);
                        todoListsResults = todoListsResults.Skip(pageIndex * pageSize).Take(pageSize);
                    }
                    else
                    {
                        todoListsResults = todoListsResults.OrderBy(s => s.id_postulante);
                        todoListsResults = todoListsResults.Skip(pageIndex * pageSize).Take(pageSize);
                    }
                    /*---*/

                    var jsonData = new
                    {
                        total = totalPages,
                        page,
                        records = totalRecords,
                        rows = todoListsResults.ToList()
                    };
                    return Json(jsonData, JsonRequestBehavior.AllowGet);
                }
            }

    viernes, 17 de noviembre de 2017 23:12
  • ¡Me rindo!, tú ganas. Funcionará, pero no es lo que desde un inicio te venia proponiendo, lo que he escrito te ahorraría líneas de código y la doble asignación que no me gusta, en fin, quizá no supe explicarme bien.


    viernes, 17 de noviembre de 2017 23:28