none
Consulta NOT IN para LINQ RRS feed

  • Pregunta

  • Hola a todos. Tengo la siguiente duda, espero que me puedan ayudar

    Necesito crear una consulta LINQ que sea similar a esta consulta SQL:

     

    SELECT espacios.id AS id, espacios.nombre AS nombre
    FROM espacios 
    WHERE espacios.id NOT IN (SELECT espacios_horarios.id_espacio FROM espacios_horarios)

     

    He intentado (sin éxito) crear la consulta de LINQ en Visual Basic, de la siguiente manera:

     

    Dim dtEspacios As DataTable = EspacioFisico.VerListado
    Dim dtEspaciosAsociados As DataTable = EspacioFisico.VerAsociaciones
    
    'Crear consulta LINQ
    Dim query = From rowEspacios In dtEspacios.AsEnumerable _
          Where rowEspacios.Field(Of Integer)("id") IsNot (From rowEspaciosAsociados In dtEspaciosAsociados.AsEnumerable _
                                   Select New With { _
                                   .qryIdEspaciosAsociados = rowEspaciosAsociados.Field(Of Integer)("idEspacioAsociado") _
                                   }) _
          Select New With { _
          .qryId = rowEspacios.Field(Of Integer)("id"), _
          .qryNombre = rowEspacios.Field(Of String)("nombre") _
              }

     

    Espero que me puedan ayudar. Saludos

     

    Leonardo González

     

    domingo, 18 de abril de 2010 0:21

Todas las respuestas

  • hola

    The NOT IN clause in LINQ to SQL

    el ejemplo esta en c#, solo quedaria traducirlo, pero al menos podras ver la tecnica que aplica

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 18 de abril de 2010 1:09
  • Muchas gracias Leandro por la respuesta. Ya habia entrado antes a ese enlace, aunque me faltaba un método al final de la consulta. La consulta LINQ me queda ahora de esta forma:

    Dim dtEspacios As DataTable = EspacioFisico.VerListado
    Dim dtEspaciosAsociados As DataTable = EspacioFisico.VerAsociaciones
    
    'Crear consulta LINQ
    Dim query = From rowEspacios In dtEspacios.AsEnumerable _
       Where Not (From rowEspaciosAsociados In dtEspaciosAsociados.AsEnumerable _
                    Select New With { _
                    .qryIdEspaciosAsociados = rowEspaciosAsociados.Field(Of Integer)("idEspacioAsociado") _
                    }).Contains(rowEspacios.Field(Of Integer)("id")) _
       Select New With { _
       .qryId = rowEspacios.Field(Of Integer)("id"), _
       .qryNombre = rowEspacios.Field(Of String)("nombre") _
         }
    

    pero me marca el siguiente error en: .Contains(rowEspacios.Field(Of Integer)("id"). El error es el siguiente:

    Un valor de tipo 'Integer' no se puede convertir en '<tipo anónimo> (línea 31)'. 

     

    Tenés alguna idea de lo que podrá ser?

     

    Info adicional:

    A uno de los datatables (dtEspaciosAsociados) lo completo a partir de una lista de objetos creados por mi. La carga de los datatables se realiza bien.


    domingo, 18 de abril de 2010 1:23
  • Muchas gracias Leandro por la respuesta. Ya habia entrado antes a ese enlace, aunque me faltaba un método al final de la consulta. La consulta LINQ me queda ahora de esta forma:

    Dim dtEspacios As DataTable = EspacioFisico.VerListado
    Dim dtEspaciosAsociados As DataTable = EspacioFisico.VerAsociaciones
    
    'Crear consulta LINQ
    Dim query = From rowEspacios In dtEspacios.AsEnumerable _
       Where Not (From rowEspaciosAsociados In dtEspaciosAsociados.AsEnumerable _
                    Select New With { _
                    .qryIdEspaciosAsociados = rowEspaciosAsociados.Field(Of Integer)("idEspacioAsociado") _
                    }).Contains(rowEspacios.Field(Of Integer)("id")) _
       Select New With { _
       .qryId = rowEspacios.Field(Of Integer)("id"), _
       .qryNombre = rowEspacios.Field(Of String)("nombre") _
         }
    

    pero me marca el siguiente error en: .Contains(rowEspacios.Field(Of Integer)("id"). El error es el siguiente:

    Un valor de tipo 'Integer' no se puede convertir en '<tipo anónimo> (línea 31)'. 

     

    Tenés alguna idea de lo que podrá ser?

     

    Info adicional:

    A uno de los datatables (dtEspaciosAsociados) lo completo a partir de una lista de objetos creados por mi. La carga de los datatables se realiza bien.


    domingo, 18 de abril de 2010 1:23
  • hola

    la verdad no lo probe, pero imagino que se debe a que has puesto un Select New en el query de linq interno, cuando en realidad deberia ser un dato simple

     

    Dim query = From rowEspacios In dtEspacios.AsEnumerable _
       Where Not (From rowEspaciosAsociados In dtEspaciosAsociados.AsEnumerable _
                    Select rowEspaciosAsociados.Field(Of Integer)("idEspacioAsociado") _
                    ).Contains(rowEspacios.Field(Of Integer)("id")) _
       Select New With { _
       .qryId = rowEspacios.Field(Of Integer)("id"), _
       .qryNombre = rowEspacios.Field(Of String)("nombre") _
       }

     

    saludos

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 18 de abril de 2010 3:36
  • Hola Leandro!!! muchas gracias por tu respuesta. Al fin me funcionó!!! La verdad es que LINQ es todavia una materia pendiente para mí. Me cuesta mucho interpretar la sintaxis de las consultas. Una vez más... enormemente agradecido por tu ayuda.

     

    Atte.-

     

    Leonardo González

    domingo, 18 de abril de 2010 17:31
  • hola

    que bueno que pudiste solucionarlo

    al final el problema que tenias se resolvio quitando el Select New, o aplicaste algun otro cambio para resolverlo

     

    Nota, recuerda marcar la respuestas que te han ayudado, asi colaboras a mentener el foro, y de paso si alguien encuentra esta pregunta puede saber como lo has solucionado

     

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 18 de abril de 2010 20:16
  • Exactamente como vos lo propusiste
    domingo, 18 de abril de 2010 20:17