none
Como crear una expresión para enviar como argumento a un procedimiento RRS feed

  • Pregunta

  • Hola

    Tengo un software de terceros al que he de pasarle como argumento una expresión, sin embargo no se como hacerlo. Este es el código

     

    Public Class Prueba
          Public Property id As Integer
          Public Property Nombre As Integer
        End Class
    
          Dim ord As System.Linq.Expressions.Expression(Of System.Func(Of Prueba, Prueba))
    

    El Argumento a pasar es ORD y debe contener los campos de la clase prueba por las que se hara una ordenación de una colección en un FOR de LINQ en ese software de terceros

    ¿Alguién me puede orientar al respecto?

    Gracias


    Julio Trujillo Leon. Microsoft Certified Professional Developer. .NET Developer and TFS admin. . Please, if my contribution is useful for you press on "useful button" Por favor, si les ha sido útil pulsen en "el mensaje ha sido útil" https://www.mcpvirtualbusinesscard.com/VBCServer/JulioTrujilloLeon/interactivecard
    miércoles, 29 de septiembre de 2010 15:09

Respuestas

  • Hola JA

    Ya tengo la solucion al problema. Tus comentarios me han hecho recapacitar sobre lo que llevaba visto del proyecto mencionado en codeplex y al mirar el código en C# me he dado cuenta de una cosa.

    La firma del la invocación al procedimiento estaba mal.

    Si observas el ejemplo que subi,, la definición de la firma es esta:

    Public Class ExampleExpression(Of TEntity As {Class, New})
    
      Public Function ExpampleProc(Of s)(
        ByVal orderByExpression As _
          System.Linq.Expressions.Expression(Of Func(Of TEntity, s))) _
        As IEnumerable(Of TEntity)
    
    

     

    la de la invocación al procedimiento esta otra

    Dim example As New ExampleExpression(Of DataClass)
        Dim ReturnOrderedList As List(Of DataClass)
        Dim OrderedSpecification As System.Linq.Expressions.Expression(Of Func(Of DataClass, DataClass)) = Nothing
    
    'error in VS2010 editor
        OrderedSpecification = Function(dc) dc.id
    
        ReturnOrderedList = example.ExpampleProc(OrderedSpecification)
    
    

    Cuando debería haber sido esta:

        OrderedSpecification = Function(dc) dc.id
    
        ReturnOrderedList = example.ExpampleProc(Of Integer)(OrderedSpecification)
    
    
    
    
    
    

    Es decir, faltaba el "(Of Integer)"

    En eso VS2010 no avisa del problema, o mejor dicho si avisa pero no el lugar adecuado, si se marcara como error el 'ExpampleProc' en lugar del parámetro como hacía, entonces queda mucho más claro.

    Además, en VS2010 existe el "propositor de cambios" que te propone hacer sustituciones (en una ventana flotante con la solución), es una pena que no haya advertido este caso.

    Supongo que como siempre, el "copiar y pegar" juega malas pasadas

    Un saludo


    Julio Trujillo Leon. Microsoft Certified Professional Developer. .NET Developer and TFS admin. . Please, if my contribution is useful for you press on "useful button" Por favor, si les ha sido útil pulsen en "el mensaje ha sido útil" https://www.mcpvirtualbusinesscard.com/VBCServer/JulioTrujilloLeon/interactivecard
    martes, 5 de octubre de 2010 17:34

Todas las respuestas

  • Hola,

    Mira si este ejemplo de la MSDN puede servirte:

    http://msdn.microsoft.com/en-us/library/system.linq.expressions.lambdaexpression.aspx

    Saludos,

    JAReyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    jueves, 30 de septiembre de 2010 13:08
  • Hola JA

    Pués la verdad es que no veo como puede ayudarme a crear una exprexión que contenga los nombres de las propiedades de una clase.


    Julio Trujillo Leon. Microsoft Certified Professional Developer. .NET Developer and TFS admin. . Please, if my contribution is useful for you press on "useful button" Por favor, si les ha sido útil pulsen en "el mensaje ha sido útil" https://www.mcpvirtualbusinesscard.com/VBCServer/JulioTrujilloLeon/interactivecard
    jueves, 30 de septiembre de 2010 13:49
  • Hola de nuevo,

    Para eso tienes que utilizar Reflection:

    http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx

    A partir de un tipo determinado puedes utilizar el método GetProperties con los flags adecuados y a traves del objeto PropertyInfo puedes acceder a la propiedad Name que te retornará el nombre de la propiedad.

    Saludos,

    JAReyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    jueves, 30 de septiembre de 2010 15:08
  • Hola Julio,

    Pudiste finalmente solvantar tu problema de obtención de las propiedades mediante Reflection?

    Saludos,

    JAReyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    domingo, 3 de octubre de 2010 14:47
  • Hola JA

    Pues no. La verdad es que es demasiado abstracto para mi el poder crear una expression que incorpore solo nombres de propiedades del objeto. Si puedes de forma sencilla decirme como hacerlo te lo agradecería.

    Un saludo


    Julio Trujillo Leon. Microsoft Certified Professional Developer. .NET Developer and TFS admin. . Please, if my contribution is useful for you press on "useful button" Por favor, si les ha sido útil pulsen en "el mensaje ha sido útil" https://www.mcpvirtualbusinesscard.com/VBCServer/JulioTrujilloLeon/interactivecard
    lunes, 4 de octubre de 2010 15:31
  • Ok,

    Los parametros a pasar van a ser siempre los mismos o pueden ser de varias clases con campos diferentes?


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    lunes, 4 de octubre de 2010 15:35
  • Sería siempre de la misma clase, de hecho el argumento queda definido del tipo "As System.Linq.Expressions.Expression(Of System.Func(Of Prueba, Prueba))" donde "Prueba" es la clase en cuestión.
    Julio Trujillo Leon. Microsoft Certified Professional Developer. .NET Developer and TFS admin. . Please, if my contribution is useful for you press on "useful button" Por favor, si les ha sido útil pulsen en "el mensaje ha sido útil" https://www.mcpvirtualbusinesscard.com/VBCServer/JulioTrujilloLeon/interactivecard
    lunes, 4 de octubre de 2010 15:37
  • Hola de nuevo,

    Necesitaría un poco más de información sobre la firma del método de llamada. Podrías añadir algún ejemplo un poco más completo?

    Gracias.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    martes, 5 de octubre de 2010 8:36
  • Hola JA

    http://cid-2e2905d39242e880.office.live.com/self.aspx/.Public/DemoExpression.rar

    Aqui tienes un breve ejemplo en VS2010. Se trata de una app de consola con dos clases. El problema me viene al tratar de componer la expresión, mira en la línea del Main() donde pone:

    OrderedSpecification = Function(dc) dc.id

    verás como aparece subrayada como error por visual studio. A esa expresión hay que hacerle llegar las propiedades (o la propiedad, solo una) de una clase dada por la que quieras ordenar.

    Un saludo y muchas gracias por tu tiempo


    Julio Trujillo Leon. Microsoft Certified Professional Developer. .NET Developer and TFS admin. . Please, if my contribution is useful for you press on "useful button" Por favor, si les ha sido útil pulsen en "el mensaje ha sido útil" https://www.mcpvirtualbusinesscard.com/VBCServer/JulioTrujilloLeon/interactivecard
    martes, 5 de octubre de 2010 9:07
  • Hola de nuevo,

    No se si te entendí del todo bien. Estas intentando hacer esto?

    http://msdn.microsoft.com/en-us/library/ff457936(VS.91).aspx

    Saludos,

    JAReyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    martes, 5 de octubre de 2010 11:55
  • Creo que sí.

    Digo "Creo" porque el software con el que estoy trabajando es de terceros que creo conocerás, en concreto es el proyecto de codeplex http://microsoftnlayerapp.codeplex.com/

    Estoy teniendo problemas con estas "expressions" debido a que el software ejemplo del proyecto está desarrollado en C# y las transcripciones de las expresiones lambda varían mucho de ese lenguaje a VB.NET

    Efectifavmente el software lo que hace es ordenar resultados de consultas para listas de EF en la cláusula OrderBy

    Saludos


    Julio Trujillo Leon. Microsoft Certified Professional Developer. .NET Developer and TFS admin. . Please, if my contribution is useful for you press on "useful button" Por favor, si les ha sido útil pulsen en "el mensaje ha sido útil" https://www.mcpvirtualbusinesscard.com/VBCServer/JulioTrujilloLeon/interactivecard
    martes, 5 de octubre de 2010 12:02
  • Ok,

    Si, conozco perfectamente el ejemplo de codeplex.

    En tal caso, si necesitas realizar conversiones a VB.NET puedes encontrar multitud de programas de conversión por la web, aunque una opción que te recomendaría sería usar el Dissasembler de Reflector para abrir los assemblies de C# y ver directamente el código generado en VB.NET.

    Espero que esto pueda servirte.

    Saludos,

    JAReyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    martes, 5 de octubre de 2010 12:20
  • Hola Julio,

    Pudiste realizar la prueba que te comentaba con Reflector?

    Tendrás todo el código traducido directamente a VB.NET... Cualquier problema al respecto, no dudes en comentarlo.

    Saludos,

    JAReyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    martes, 5 de octubre de 2010 17:33
  • Hola JA

    Ya tengo la solucion al problema. Tus comentarios me han hecho recapacitar sobre lo que llevaba visto del proyecto mencionado en codeplex y al mirar el código en C# me he dado cuenta de una cosa.

    La firma del la invocación al procedimiento estaba mal.

    Si observas el ejemplo que subi,, la definición de la firma es esta:

    Public Class ExampleExpression(Of TEntity As {Class, New})
    
      Public Function ExpampleProc(Of s)(
        ByVal orderByExpression As _
          System.Linq.Expressions.Expression(Of Func(Of TEntity, s))) _
        As IEnumerable(Of TEntity)
    
    

     

    la de la invocación al procedimiento esta otra

    Dim example As New ExampleExpression(Of DataClass)
        Dim ReturnOrderedList As List(Of DataClass)
        Dim OrderedSpecification As System.Linq.Expressions.Expression(Of Func(Of DataClass, DataClass)) = Nothing
    
    'error in VS2010 editor
        OrderedSpecification = Function(dc) dc.id
    
        ReturnOrderedList = example.ExpampleProc(OrderedSpecification)
    
    

    Cuando debería haber sido esta:

        OrderedSpecification = Function(dc) dc.id
    
        ReturnOrderedList = example.ExpampleProc(Of Integer)(OrderedSpecification)
    
    
    
    
    
    

    Es decir, faltaba el "(Of Integer)"

    En eso VS2010 no avisa del problema, o mejor dicho si avisa pero no el lugar adecuado, si se marcara como error el 'ExpampleProc' en lugar del parámetro como hacía, entonces queda mucho más claro.

    Además, en VS2010 existe el "propositor de cambios" que te propone hacer sustituciones (en una ventana flotante con la solución), es una pena que no haya advertido este caso.

    Supongo que como siempre, el "copiar y pegar" juega malas pasadas

    Un saludo


    Julio Trujillo Leon. Microsoft Certified Professional Developer. .NET Developer and TFS admin. . Please, if my contribution is useful for you press on "useful button" Por favor, si les ha sido útil pulsen en "el mensaje ha sido útil" https://www.mcpvirtualbusinesscard.com/VBCServer/JulioTrujilloLeon/interactivecard
    martes, 5 de octubre de 2010 17:34