Usuario
como inicializar una variable para resultados de LINQ

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
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 -
-
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:
-
-
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); } }
-
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:
- Editado Jorge TurradoMVP viernes, 17 de noviembre de 2017 16:52
-
-
...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
-
-
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- Editado Leandro TuttiniMVP viernes, 17 de noviembre de 2017 17:19
-
-
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 -
-
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); }
-
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.
- Propuesto como respuesta Jorge TurradoMVP viernes, 17 de noviembre de 2017 18:19
- Editado Willams Morales viernes, 17 de noviembre de 2017 18:39
-
-
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 -
//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 }
-
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);
}
} -