Los foros del Guille

elGuille.hosting: La oferta recomendada:
.NET 2.0, SQL Server, 1200MB, 10GB transf. por 9.95 Euros al mes

Si no encuentras respuesta, puedes buscar en el sitio del Guille

Google
 
Selecciona el foro y pulsa en mostrar:     Mostrar 
De tu interés (algunos de los avisos publicados)

15/jun/2007
Cuando hagas una consulta, por favor indica que versión del lenguaje estás usando y procura hacer la pregunta en el foro más adecuado... para eso hay varios.
Gracias.

  Foro: .NET.LINQ Cantidad:  Desde:   Hasta:    Aplicar   Responder 
Respuestas a: 54991 - Consultas dinamicas LINQ Entities
IDAsuntoFechaNick 
54991 Consultas dinamicas LINQ Entities07/04/11 10:06drbmb   
Hola... llevo atascado un buen rato con esto y espero que alguien me pueda echar una manita...



Veamos...

Estoy tratando de hacer un método que genere una consulta dinamica sobre entidades de Entity Framework (en concreto, uso self tracking entities por encima de Entity FrameWork)


Public Class Specification(Of TEntity As Class)

Private _predicado As Expression(Of Func(Of TEntity, Boolean))

Public Sub New(ByVal columna As String, ByVal condicion As OperadoresComparacion, ByVal valor As Object)
MyBase.New()
CondicionDinamica(columna, condicion, valor)
End Sub
Public Property Predicado() As Expression(Of Func(Of TEntity, Boolean))
Get
Return _predicado
End Get
Set(ByVal value As Expression(Of Func(Of TEntity, Boolean)))
_predicado = value
End Set
End Property



' Operadores comparación es una enumeración que me retorna el operador correcto para lambda

Public Sub CondicionDinamica(ByVal columna As String, ByVal condicion As OperadoresComparacion, ByVal valor As Object)
Dim r = GetType(TEntity)
Dim s = columna.Split("."c)


Dim pInfo As System.Reflection.PropertyInfo = r.GetProperty(s(0))
Dim paramExpr = Expression.Parameter(r, r.Name)


Dim callExpr = Expression.MakeMemberAccess(paramExpr, pInfo)

For i = 1 To UBound(s)
pInfo = pInfo.PropertyType.GetProperty(s(i))
callExpr = Expression.MakeMemberAccess(callExpr, pInfo)
Next

Dim valueExpr = Expression.Constant(valor, valor.GetType)

Dim b As Expression = CombineExpression(callExpr, condicion, valueExpr)

Me.Predicado = Expression.Lambda(Of Func(Of TEntity, Boolean))(b, New ParameterExpression() {paramExpr})

End Sub



End Class



En concreto, lo que me está dando problemas es "CondicionDinamica"



Si yo tengo una Entidad Persona (digamos que con un campo DNI), que tiene una relacion con otra entidad "datospersonales" del tipo 1->1 (es decir, cada registro persona tiene su nombre y apellidos en otra tabla relacionada, y unicamente 1 nombre y apellidos, claro)

A su vez, la entidad Persona tiene otra relacion 1 a muchos digamos con sus "datosdireccion" (una persona tiene en la tabla datosdireccion varios registros de direcciones)

Entonces, si hago esto:

Dim Filtro As New Specification(Of Entidades.Persona)
Filtro.CondicionDinamica("DNI", OperadoresComparacion.Equal, "00000000T") 'funciona perfectamente

Filtro.CondicionDinamica("datospersonales.nombre", OperadoresComparacion.Equal, "Antonio") 'funciona perfectamente

Filtro.CondicionDinamica("datosdireccion.calle", OperadoresComparacion.Equal, "la calle") 'NO FUNCIONA, produce un error.

Esto por lo que he podido comprobar se poduce debido a que la relacion entre Personas y datosdireccion es 1->muchos.

Básicamente,

Dim pInfo As System.Reflection.PropertyInfo = r.GetProperty(s(0)) en el caso de relacion 1->1 con datospersonales, retorna un elemento cuyo PropertyType, es la entidad "datospersonales".

Pero si la relación es 1->muchos, se trata de una TrackableCollection (of datosdireccion) y eso hace que dentro del bucle for, no localice nada y de error al agregar MemeberAccess...

Espero que alguien entienda este rollo que he soltado, y sobre todo que sepa darme luz en el asunto.. no sé cómo puedo solucionarlo...

El caso es que quiero poder hacer consulta dinamica de esta forma, pero pudiendo acceder a las tablas relacionadas 1 a muchos... no unicamente 1 a 1...



Muchas gracias por todo de antemano....

 
(c) Guillermo 'guille' Som, 2005-2017  - foros.elGuille v1.0.5.3 (23/Mar/2009 14:50 GMT +1)  - (ASP.NET 2.0 v2.0.50727.8762)
 
Usuarios activos: 85 - App. iniciada: 20/11/2017 14:38:06 GMT - La hora GMT del servidor es: 20/11/2017 15:22:13 GMT