none
OPERADOR EXISTS EN LINQ RRS feed

  • Pregunta

  • Amigos desarrolladores, necesito hacer la siguiente consulta T-SQL  con LINQ utilizando expresiones LAMBDA.

    Select

    *

    From

    Clientes A

    Where

    NOT Exists (Select * From Direcciones Where ClieID = A.ClieID)


    var clientessindireccion = db.Clientes....

    Les agradeceré su apoyo

    lunes, 19 de agosto de 2013 0:25

Respuestas

  • Supongo que si quieres hacer una consulta LinQ con una expresión lambda es porque estas utilizando EF

    Para obtener los clientes que no tengan direcciones sería:

    var clientes = _dbClientes.Clientes.Where(x => !x.Direcciones.Any());

    Pero esto depende como hayas creado las entidades y las relaciones entre ellas.

    si ves que tienes problemas puedes forzar la carga de la tabla relacionada direcciones utilizando .include("nombreTabla")

    Espero que te sirva ;-)


    Web: http://mrubino.net Blog: http://geeks.ms/blogs/mrubino Twitter: @Marc_Rubino

    • Marcado como respuesta Willams Morales martes, 20 de agosto de 2013 14:38
    martes, 20 de agosto de 2013 7:49
  • hola

    por lo que entendi usas entity framework o linq to sql, por lo que el linq que definas se transformara en una instruccion sql que impactara contra la db

    no realice pruebas de performance, pero tiendo a pensar que la generacion de un join es mas eficiente que la de un exists (si es esta la instrucion que se genera)

    por supuesto habria que probarlo, lo ideal seria que realices la ejecucion con el Any y tambien con el join, utilices el Sql Profiler para capturar que instruccion sql se genera he impacta contr ala db y se vea cual responde mejor en el plan de ejecucion

    habria que ver cual usa los indices mas eficientemente cuando se ejecuta, porque esto no es un linq de objetos en memoria, sino que se convierte en un sql que ejecuta contra registros de la db

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta Willams Morales jueves, 22 de agosto de 2013 20:31
    jueves, 22 de agosto de 2013 6:09

Todas las respuestas

  • podrias usar un left join, es mas en T-SQL tambien se usa el left join para estos casos

    utilizar el del exist en este caso que planteas de t-sql esta incorrecto

    join (Cláusula, Referencia de C#)

    How to: Perform Left Outer Joins (C# Programming Guide)


    en el link hay un ejemplo para implementar el left join

    y asi devolver todos los clientes que no tiene direccion

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina



    lunes, 19 de agosto de 2013 1:14
  • Buenas, para hacerlo mediante Linq y Lambda es sencillo.

    Si miramos el codigo, quieres mostrar los clientes que no estén en la tabla de direccion.

    Suponemos (para hacer un LinQ) que tenemos dos listas una clientes y otra direcciones
    (lstclientes y lstdirecciones)

    tendrias que hacer lo siguiente (Te lo pongo en VB aunque en C# es muy similar):

    Dim qry = lstclientes.Where(Function(a) lstdirecciones.Exists(Function(b) b.ClieID = a.ClieID))

    en qry3 obtendrás la lista que deseas en memoria. como es una lista de clientes, puedes castearlo sin problemas dim qry as list(of clientes).

    Espero que te sea de ayuda.

    Edito: El codigo es para saber si existe, si quieres que no exista, hay que hacer la negación (en el ejemplo un not exists)

    Saludos!


    • Editado Jnavero lunes, 19 de agosto de 2013 10:14 Edicion
    lunes, 19 de agosto de 2013 10:08
  • Supongo que si quieres hacer una consulta LinQ con una expresión lambda es porque estas utilizando EF

    Para obtener los clientes que no tengan direcciones sería:

    var clientes = _dbClientes.Clientes.Where(x => !x.Direcciones.Any());

    Pero esto depende como hayas creado las entidades y las relaciones entre ellas.

    si ves que tienes problemas puedes forzar la carga de la tabla relacionada direcciones utilizando .include("nombreTabla")

    Espero que te sirva ;-)


    Web: http://mrubino.net Blog: http://geeks.ms/blogs/mrubino Twitter: @Marc_Rubino

    • Marcado como respuesta Willams Morales martes, 20 de agosto de 2013 14:38
    martes, 20 de agosto de 2013 7:49
  • Amigo Marc Rubio. Hago lo que mencionas y no sale nada en la lista, aún cuando hay clientes que no tienen direcciones.

    Uso EF: Clientes -> Direcciones (Un cliente puede tener uno o muchas direcciones). Te agradeceré tu apoyo

    martes, 20 de agosto de 2013 14:29
  • Marc, fue un error mio. Tú solución es correcta. Lo que sucedió es que al final debí seleccionar campos, ya que el resultado lo boto a un selectlist. Gracias por tu apoyo.
    martes, 20 de agosto de 2013 14:38
  • hola

    vuelvo a recomendar usa el "left join"

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 20 de agosto de 2013 14:38
  • Gracias Leandro por recomendar lo que consideras correcto, pero podrías por favor decirnos porque sugieres utilizar LEFT JOIN a el operador ANY que propuso MARC?

    Creo que mas de uno te lo agradecerá el que puedas compartir tu sustento.

    jueves, 22 de agosto de 2013 5:29
  • hola

    por lo que entendi usas entity framework o linq to sql, por lo que el linq que definas se transformara en una instruccion sql que impactara contra la db

    no realice pruebas de performance, pero tiendo a pensar que la generacion de un join es mas eficiente que la de un exists (si es esta la instrucion que se genera)

    por supuesto habria que probarlo, lo ideal seria que realices la ejecucion con el Any y tambien con el join, utilices el Sql Profiler para capturar que instruccion sql se genera he impacta contr ala db y se vea cual responde mejor en el plan de ejecucion

    habria que ver cual usa los indices mas eficientemente cuando se ejecuta, porque esto no es un linq de objetos en memoria, sino que se convierte en un sql que ejecuta contra registros de la db

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta Willams Morales jueves, 22 de agosto de 2013 20:31
    jueves, 22 de agosto de 2013 6:09
  • NO tiene mucho sentido utilizar EF si no vas a aprovechar toda su funcionalidad, si no te gusta su rendimiento no lo utilices. Simplemente tendrías que hacerte un repository con tus entidades que atacara directamente a tu BD.

    Pero si utilizas EF se entiende que te aprovecharas al máximo la potencia de LinQ y no hacer mezclas raras.

    Solo es una sugerencia ;-)


    Web: http://mrubino.net Blog: http://geeks.ms/blogs/mrubino Twitter: @Marc_Rubino

    • Marcado como respuesta Willams Morales jueves, 22 de agosto de 2013 20:31
    • Desmarcado como respuesta Willams Morales jueves, 22 de agosto de 2013 20:32
    jueves, 22 de agosto de 2013 10:19