none
Construir una sentencia en tiempo de ejecución en base a los parámetros seleccionados por el usuario RRS feed

  • Pregunta

  • Hola Buen día.

    Estoy comenzando a utilizar Linq to Entities en mis proyectos asp.net c#, sin embargo, me he topado con un problema, el cual no me ha permitido avanzar y es que tengo un formulario en donde el usuario tiene una serie de combos que le sirven para filtrar la información que necesita por cualquiera de esos criterios. Por ejemplo:

    si el usuario no selecciona ningún criterio, le muestro todos los datos como podría ser

    var consulta=from A in db.Tabla1 select A;

    si el usuario en cambio selecciona un criterio para filtrar necesito poner algo como

    var consulta=from A in db.Tabla1 select A;

    if (Combo=ValorSeleccionado)

    {

    consulta=consulta+ where A.Campo1==ValorSeleccionado;

    }

    Sé que lo que puse no funciona aparte de que el where va antes del select, sólo quiero expresar lo que quiero hacer, y es alterar la sentencia en base a la selección de parámetros del usuario.

    Habiendo explicado lo anterior pongo la sentencia que tengo la cual arroja todos los registros sin filtros y que necesito modificar en tiempo de ejecución en base a los que el usuario indique:

    tarifas =

    from C in (from cli in db.cliente join UC in db.usuario_cliente on cli.Clienteid equals UC.Clienteid join U in db.usuario on UC.Usuarioid equals U.Usuarioid

    "Si el usuario filtra por el criterio usuario, aquí necesito alterar esta sentencia

    para que agregue: where U.UsuarioId==Valor y si no, lo deje como está"

    join PC in (from plc in db.plantas_clientes group new { plc } by new

    { plc.Clienteid, plc.Plantaid } into g select new { g.Key.Clienteid, g.Key.Plantaid }) on cli.Clienteid equals PC.Clienteid join pl in db.plantas on PC.Plantaid equals pl.Plantaid

    select new { cli.Clienteid, cli.NombreCte, pl.Plantaid, pl.Planta, U.Nombre }) join tarifacliente in db.TarifaCliente

    on C.Clienteid equals tarifacliente.ClienteID where C.Plantaid == tarifacliente.PlantaId join servicio in db.Servicio on tarifacliente.ServicioID equals servicio.ServicioId join tipoProducto in db.TipoProducto on tarifacliente.TipoProductoID equals tipoProducto.tipoProductoId select new{tarifacliente.TarifaId, C.NombreCte, C.Plantaid, C.Planta, servicio.ServicioId, servicio.Concepto, tipoProducto.tipoProducto1, tarifacliente.InicioVigencia, tarifacliente.FinVigencia, tarifacliente.TarifaPesos};

    Ojalá me haya podido explicar y me pueda alguien ayudar con esto.

    Saludos.

    miércoles, 12 de junio de 2013 20:36

Respuestas

  • puedes usar un or en el where y validar que lo que estas filtrando no sea vació o valor default

    por ejemplo

    var q = from c in datacontext.clientes 
    where c.NoCliente == _NoCliente | _NoCliente == 0;

    al ser verdadera la condición del or se cancela el where, deberás usar un where para cada validación que desees hacer de esta manera

    var q = from c in datacontext.clientes 
    where c.NoCliente == _NoCliente | _NoCliente == 0
    where c.NomCliente == _Nom | _Nom == "";



    • Editado Arthuro Zerda martes, 18 de junio de 2013 16:34
    • Marcado como respuesta Kaliman_jr miércoles, 19 de junio de 2013 16:07
    martes, 18 de junio de 2013 16:32

Todas las respuestas

  • si el usuario no selecciona ningún criterio, le muestro todos los datos como podría ser

    porque no aplcias lo comentado aqui

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/f2bfea08-195a-481f-89d2-dce0f592c9ac/

    http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/55f82677-6276-4fb8-a40a-8491ab5ff70f/


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 13 de junio de 2013 2:58
  • Hola Leandro.

    Gracias por responder.

    Aclarando un poco, sobre mostrarle toda la información a un usuario o no, me refiero a que entre más filtros aplique el usuario para personalizar su consulta menor será el número de registros obtenidos, aquí es donde en una consulta convencional, empiezo a agregar where, and, or y toda clase de operadores necesarios para cumplir las condiciones indicadas por el usuario. Si no desea filtrar su consulta le muestro el total de registros.

    He leído los comentarios de los links que me pusiste. Ya había visto algo de filtros dinámicos, me refiero a algo como lo que pone Pedro Hurtado:

    var Lista = new List<int>()
                {
                    1,2,3,4,5,6,7,8,9
                };
    
                var resultado = from b in Lista
                              select b;
    
                resultado = resultado.Where(c => c != 1);
                resultado = resultado.Where(c => c != 2);
    
                foreach (var item in resultado)
                {
                    Console.Write(item);
                }

    En esa parte, llamándolo de alguna manera "concatena" el where a su sentencia en base a los criterios que el usuario haya especificado.

    En mi caso, no puedo utilizar algo como eso, ya que el "where" puede o no ir en mi consulta. Si no filtra el usuario no puedo poner la palabra where.

    Pongo la primera parte de mi consulta de nuevo para ser más claro:

     

    tarifas =

    from C in (from cli in db.cliente join UC in db.usuario_cliente on cli.Clienteid equals UC.Clienteid join U in db.usuario on UC.Usuarioid equals U.Usuarioid

    "Si el usuario decide filtrar por usuario Aquí debo agregar (where U.UsuarioId==UsuarioId)

    Si no lo hace no puedo dejar (where) ya que enseguida tengo un join".


    No tendría problema poniendo un if verificando si se aplica el filtro o no y escribiendo una sentancia diferente para cada caso. Mi problema es que aplico 5 filtros y la combinación de ellos me dan bastantes sentencias que escribir.

    Saludos. 

    jueves, 13 de junio de 2013 14:17
  • puedes usar un or en el where y validar que lo que estas filtrando no sea vació o valor default

    por ejemplo

    var q = from c in datacontext.clientes 
    where c.NoCliente == _NoCliente | _NoCliente == 0;

    al ser verdadera la condición del or se cancela el where, deberás usar un where para cada validación que desees hacer de esta manera

    var q = from c in datacontext.clientes 
    where c.NoCliente == _NoCliente | _NoCliente == 0
    where c.NomCliente == _Nom | _Nom == "";



    • Editado Arthuro Zerda martes, 18 de junio de 2013 16:34
    • Marcado como respuesta Kaliman_jr miércoles, 19 de junio de 2013 16:07
    martes, 18 de junio de 2013 16:32
  • Excelente Arthuro Zerda!

    Te lo agradezco mucho, es justo lo que estaba buscando. Me resultó perfectamente bien.

    Aprovechando, quisiera saber si conoces algún libro o material que me puedas recomendar de LINQ to Entities que cubra todos estos aspectos que muchas veces es difícil encontrar en la red. Desde nivel básico a avanzado.

    Saludos. 

     
    miércoles, 19 de junio de 2013 16:06
  • la verdad es que aprendí LinQ con la documentación de microsoft y sobre la marcha, nunca use un libro, la documentación de MSDN es muy buena, te recomendaría empezar por ahí

    Saludos!

    miércoles, 19 de junio de 2013 20:56