Foros del Web » Programación para mayores de 30 ;) » .NET »

WHERE IN en LINQ

Estas en el tema de WHERE IN en LINQ en el foro de .NET en Foros del Web. Buenas tardes. Hace muy poco que he empezado con LINQ (¡¿cómo he podido resistirme tanto tiempo?!). El caso que me trae es LINQ con XML ...
  #1 (permalink)  
Antiguo 01/04/2013, 09:53
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
WHERE IN en LINQ

Buenas tardes. Hace muy poco que he empezado con LINQ (¡¿cómo he podido resistirme tanto tiempo?!). El caso que me trae es LINQ con XML y la idea es sencilla: buscar todos los elementos que estén en una lista, es decir, la clausula WHERE IN. Estas son las funciones:

Código vb:
Ver original
  1. 'Primero se extraen los identificadores de los elementos a buscar
  2. Protected Sub btnActualizaDestacados_Click(ByVal sender As Object, ByVal e As System.EventArgs)
  3.    Dim lDest As New List(Of String)
  4.    For Each gvr As GridViewRow In Me.gvLibros.Rows
  5.       If CType(gvr.Cells(0).FindControl("chkDestacar"), CheckBox).Checked Then
  6.          lDest.Add(gvr.Cells(1).Text)
  7.       End If
  8.    Next
  9.    Dim c As New Catalogo(btnBuscar.CommandArgument)
  10.    Response.Write(c.destaca(lDest.ToArray))
  11. End Sub
  12.  
  13. 'Dentro de la clase Catalogo
  14. Public Function destaca(ByVal IDs() As String) As String
  15.    Dim xd As XElement = XElement.Load(_rutaArc)
  16.    Dim dests = From c In xd.Descendants(ns + "BookListing") _
  17.       Where IDs.Contains(c.Elements(ns + "vendorListingid").Value.ToString) _
  18.       Select c
  19.    Return dests.Count
  20. End Function
El XML es un catálogo de AbeBooks
Código XML:
Ver original
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <BookListingInventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.abebooks.com/BookListingXml">
  3.     <BookListing listingsid="0" typecode="1001">
  4.         <vendorListingid>000001</vendorListingid>
  5.         ......
La función destaca() siempre me devuelve 0 encontrados y lDest contiene la lista de los identificadores de los títulos marcados. He probado varias combinaciones, incluyendo funciones lambda y nada de nada, siempre 0.

Gracias de antemano y un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #2 (permalink)  
Antiguo 02/04/2013, 01:02
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: WHERE IN en LINQ

He cambiado de estrategia y, sin haber resuelto el problema, me he creado otro. La función destaca() lo que va a hacer es crear un archivo XML independiente en el que se guarden los identificadores destacados. El archivo destacados.xml tiene esta forma:

Código XML:
Ver original
  1. <?xml version="1.0"?>
  2. <destacados>
  3.    <id>1</id>
  4.    <id>54</id>
  5.    <id>102</id>
  6.    <id>...</id>
  7. </destacados>

Este archivo lo creo sin problemas. La cuestión ahora es que necesitaría hacer ahora las consultas uniendo los dos XML mediante el uso de JOIN en LINQ, de manera que se obtenga el catálogo y se le añada a cada título un elemento <destacado> con valor 1 ó 0 dependiendo de si su identificador está en destacados.xml.

La búsqueda debería ser algo así (lo hago de memoria porque no tengo el código a mano en este momento) pero no consigo que funcione con todos los ejemplos que he visto de "joins" en LINQ:

Código vb:
Ver original
  1. Dim xd As XElement = XElement.Load(rutaCatalogo)
  2. Dim dest as XElement = XElement.Load(rutaDestacados)
  3. Dim libs As IEnumerable(Of Libro) = From c In xd.Descendants(ns + "BookListing") _
  4.       Join d In dest.Descendants("destacados") _
  5.       On CInt(c.Elements(ns + "vendorListingid").Value) Equals Cint(d.<id>.Value)
  6.       Select New Libro(c,d)
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!

Etiquetas: linq
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:05.