Joya, El tema es así, cuando hacés var loquesea = consulta-linq el compilador infiere el tipo de resultado, o sea, se da cuenta de qué es lo que se va a generar como resultado de la consulta, esto se resuelve en tiempo de compilación no es un tipo Variant. ahora, si te fijás la consulta dice: from oDtDB in oDtDB.AsEnumerable() join dtWS in oDtWS.AsEnumerable() cuando decís "from oDtDB" estás haciendo referencia a una fila de la colección, en definitiva el resultado que se genera en el select del final lo definís vos en tu caso hacés select dtWS eso significa que vaya acumulando cada elemento de la colección dtWS en el resultado, pero la colección no es un datatable desde el momento que hiciste AsEnumerable, en resument, en tu caso vas a tener como resultado una lista IEnumerable<DataRow> según me parece, pero no un datatable, sino ponés un punto de interrupción y fijate que tiene result. saludos, Leonardo.
2009/7/6 Julio Szabo <[email protected]> > Leonardo, > > Una estupidez mía, cree la dll en VS2008 pero como no estoy muy > acostumbrado a C#, no cree como publica la clase, :$ > > Buee… cosas que pasan, jejeje, Funciona, pero, tengo el problemita de > convertir el objeto result a Datatable, te paso el método que hice: > > > > public DataTable JoinSimple(DataTable oDtDB, > > DataTable oDtWS, > > String pColumnaDB, > > String pColumnaWS) > > { > > // hace el join entre los 2 dt > > var result = from oDtDB in oDtDB.AsEnumerable() > > join dtWS in oDtWS.AsEnumerable() > > on oDtDB[pColumnaDB] equals dtWS[pColumnaWS] > > select dtWS; > > > > return result.CopyToDataTable(); > > } > > > > Y me da un error en el CopyToDataTable(), dice “El origen no contiene > DataRows”. Lo que no sé es si estoy haciendo bien el select. > > > > Muchas gracias. > > Saludos, > > > > > > * * > > *Julio E. Szabo* > > Consultoría > > [email protected] <[email protected]> > > tel.: +54 (351) 423 7176 > > cel.: (+54 9) (351) (15) 5 556048 > > [image: Compañía de Tecnologías Latinoamericana]<http://www.ctlcorp.com.ar/> > > *AVISO: El presente mensaje y los archivos adjuntos que incluya pueden > contener información confidencial de uso exclusivo del destinatario > indicado. Cualquier uso en desacuerdo con su propósito, difusión o > publicación, total o parcial, se encuentra prohibida. Si recibió este > mensaje por error, rogamos reenviarlo al emisor y destruir las copias > impresas o grabadas en su sistema.** * > > > > > > *De:* [email protected] [mailto:[email protected]] *En nombre de *Leonardo > Micheloni > *Enviado el:* Lunes, 06 de Julio de 2009 04:02 p.m. > > *Para:* [email protected] > *Asunto:* [puntonet] Realizar Join por codigo > > > > Qué es lo que no ves? la dll, la clase, el método, no funciona, la agrega > pero no compila? > > 2009/7/6 Julio Szabo <[email protected]> > > *Leonardo*, > > Hice lo que me dijiste y creo que es la solución adecuada al problema. > > Cree un proyecto en C# en VS2008 que hace el join entre los DataTables que > recibe por parámetro y devuelve el resultado en otro Datatable. > > Hasta aca todo de lujo, el problema es tengo el proyecto en VS2005 como te > había comentado anteriormente, agrego la referencia a la dll compilada en > VS2008 y no logro verla, tenes idea que puede ser? Digo, quizá haya que > agregar algo mas al proyecto en VS2005 para que pueda ver una dll en VS2008. > > > > > > Creo que sorteando este problemita, tengo solucionado el problema completo. > > > > > > Muchas gracias. > > Saludos, > > > > * * > > *Julio E. Szabo* > > Consultoría > > [email protected] <[email protected]> > > tel.: +54 (351) 423 7176 > > cel.: (+54 9) (351) (15) 5 556048 > > [image: Compañía de Tecnologías Latinoamericana]<http://www.ctlcorp.com.ar/> > > *AVISO: El presente mensaje y los archivos adjuntos que incluya pueden > contener información confidencial de uso exclusivo del destinatario > indicado. Cualquier uso en desacuerdo con su propósito, difusión o > publicación, total o parcial, se encuentra prohibida. Si recibió este > mensaje por error, rogamos reenviarlo al emisor y destruir las copias > impresas o grabadas en su sistema.** * > > > > > > *De:* [email protected] [mailto:[email protected]] *En nombre de *Leonardo > Micheloni > *Enviado el:* Lunes, 06 de Julio de 2009 02:48 p.m. > > > *Para:* [email protected] > *Asunto:* [puntonet] Realizar Join por codigo > > > > mmmno, necesitás 2008. El objeto result del ejemplo es un tipo anónimo que > se declara en el select, por eso tiene un var, si necesitás un datatable > deberías hacer select new datatabla(){inicilización}. > > Esto corre sobre .net 2.0 una vez compilado, al referencia necesaria es > System.Core y System.Data.DataExtensions, si creás un proyecto en vs2008 ya > tiene el assembly referenciado. > > Si no tenés VS2008 (el express sirve igual) no vas a poder hacerlo (en > realidad sí pero es más complicado) las opción que tenés es meter la lógica > del join en una dll creada con una versión express de vs2008 y llamarla de > 2005, eso funciona, sino directamente con vs2008 pro. O sea: > > -Te bajás VB.NET o C# 2008 express > > -Te armás una clase que reciba dos datatables y arme el join y devuelva una > colección tipada o un datatable depende de lo que necesites > > -La referencías desde VS2005 > > El truco es que VS2008 va a generar código de esa expresión que corre sobre > .net 2.0 y por eso te va a funcionar, sino fijate el ejemplo que te pasé > recién como queda descompilado > > Private Shared Sub Main(ByVal args As String()) > Dim dt1 As New DataTable > Dim dt2 As New DataTable > Dim result = dt1.AsEnumerable().Join(Of DataRow, DataRow, Object, > <>f__AnonymousType0(Of String, Integer))(dt2.AsEnumerable(), Function (ByVal > d As DataRow) > Return d.Item("columna") > End Function, Function (ByVal d2 As DataRow) > Return d2.Item("columna") > End Function, Function (ByVal d As DataRow, ByVal d2 As DataRow) > Return New { _ > .Valor1 = d.Item("valor").ToString, _ > .Criterio = Integer.Parse(d.Item("columna").ToString) _ > } > End Function) > End Sub > > > como verás es código de 2.0 (el compilador crea delagados y tipos anónimos) > los métodos Join y demás están definidos en System.Core y en > System.Data.DataExtensions. Si te complica mucho te recomiendo otra opción. > Si no cualquier cosa chiflá > > saludos, Leonardo. > > > > 2009/7/6 Julio Szabo <[email protected]> > > *Leonardo*, te paso algunas dudas que tengo al respecto: > > 1. El proyecto donde tengo el Acceso a los Datos esta en VS2005 y en > VB, esto funciona allí ? Ya sé que tengo que convertir el código que me > pasaste de C# a VB. > > 2. El objeto “result”, es un DataTable con el resultado del Join? > > 3. Tengo que instalar algo? Cuales son las referencias que tengo que > agregar al proyecto y cuales son los using o Imports que tengo que agragar > en la clase para que funcione el código que me pasate. > > > > Muchas gracias. > > Saludos, > > > > > > * * > > *Julio E. Szabo* > > Consultoría > > [email protected] <[email protected]> > > tel.: +54 (351) 423 7176 > > cel.: (+54 9) (351) (15) 5 556048 > > [image: Compañía de Tecnologías Latinoamericana]<http://www.ctlcorp.com.ar/> > > *AVISO: El presente mensaje y los archivos adjuntos que incluya pueden > contener información confidencial de uso exclusivo del destinatario > indicado. Cualquier uso en desacuerdo con su propósito, difusión o > publicación, total o parcial, se encuentra prohibida. Si recibió este > mensaje por error, rogamos reenviarlo al emisor y destruir las copias > impresas o grabadas en su sistema.** * > > > > > > *De:* [email protected] [mailto:[email protected]] *En nombre de *Leonardo > Micheloni > *Enviado el:* Lunes, 06 de Julio de 2009 12:09 p.m. > > > *Para:* [email protected] > *Asunto:* [puntonet] Realizar Join por codigo > > > > primero los datatables tiene un método que se llama AsEnumerable, es la > clave, después armás el join > > var dt1 = new DataTable(); > > var dt2 = new DataTable(); > > > var result = from d in dt1.AsEnumerable() > join d2 in dt2.AsEnumerable() > on d["columna"] equals d2["columna"] > select new {Valor1 = d["valor"].ToString(), Criterio = > int.Parse(d["columna"].ToString())}; > > algo así, cualquier cosa avisame. > > saludos, Leonardo. > > > > 2009/7/6 Julio Szabo <[email protected]> > > Podría ser una opción, pero no tengo idea como hacerlo, estuve investigando > un poco de linq, pero tengo, como para variar en cualquier proyecto, tengo > una restricción de tiempos en mi cronograma y no tengo mucho tiempo para > ponerme a investigar y hacer pruebas. > > > > Si me podes pasar algún ejemplo de cómo sería esto con linq, te agradecería > mucho. > > > > Saludos, > > > > * * > > *Julio E. Szabo* > > Consultoría > > [email protected] <[email protected]> > > tel.: +54 (351) 423 7176 > > cel.: (+54 9) (351) (15) 5 556048 > > [image: Compañía de Tecnologías Latinoamericana]<http://www.ctlcorp.com.ar/> > > *AVISO: El presente mensaje y los archivos adjuntos que incluya pueden > contener información confidencial de uso exclusivo del destinatario > indicado. Cualquier uso en desacuerdo con su propósito, difusión o > publicación, total o parcial, se encuentra prohibida. Si recibió este > mensaje por error, rogamos reenviarlo al emisor y destruir las copias > impresas o grabadas en su sistema.** * > > > > > > *De:* [email protected] [mailto:[email protected]] *En nombre de *Leonardo > Micheloni > *Enviado el:* Lunes, 06 de Julio de 2009 11:23 a.m. > *Para:* [email protected] > *Asunto:* [puntonet] Realizar Join por codigo > > > > linq? > > 2009/7/6 Julio Szabo <[email protected]> > > Buenos días a todos, > > Les escribo porque tengo un problema que no sé cómo y quizá alguien me > pueda dar una mano. > > Tengo 2 Datatables, oDt1 que viene con datos de una Base de datos y oDt2 > que viene con Datos de un Web Service, ahora bien, como puedo hacer para > hacer un join entre estos dos DataTables??? > > He intentado hacerlo con Relations en un DataSet, pero el problema es que > necesito que el join filtre información, es decir, tengo el siguiente > problema, oDt1 y oDt2, lo que necesito es obtener, oDtResultado: > > > > oDt1 > oDt2 oDtResultado > > ------ > -------------------------- ------------------------- > > 101 106 > Descripcion1 106 Descripcion1 > > 102 108 Descripcion2 > > 103 109 Descripcion3 > > 104 > > 106 > > 110 > > 121 > > > > Y con DataSets, todos los ítems tienen que tener correspondencia en la > relación, que no es mi caso. > > Ya sé que una solución sería recorrer oDt2 y fijarme que no esté en oDt1, > pero quiero saber si lo puedo hacer por algo que sea más rápido o de mejor > performance, ya que este factor es crítico. > > > > Desde ya muchas gracias. > > Saludos, > > * * > > *Julio E. Szabo* > > Consultoría > > [email protected] <[email protected]> > > tel.: +54 (351) 423 7176 > > cel.: (+54 9) (351) (15) 5 556048 > > [image: Compañía de Tecnologías Latinoamericana]<http://www.ctlcorp.com.ar/> > > *AVISO: El presente mensaje y los archivos adjuntos que incluya pueden > contener información confidencial de uso exclusivo del destinatario > indicado. Cualquier uso en desacuerdo con su propósito, difusión o > publicación, total o parcial, se encuentra prohibida. Si recibió este > mensaje por error, rogamos reenviarlo al emisor y destruir las copias > impresas o grabadas en su sistema.** * > > > > > > > > > > > > >
<<image001.gif>>
