Pregunta

Necesitamos generar consultas LINQ que son 100% desconocidas durante la codificación (tiempo de diseño). Esto se debe a que la lógica está disponible en nuestro marco, que está 100% separado de cualquier proyecto de datos. Para los datos, utilizamos el código de acceso a datos generado por LLBLGen.

Normalmente, al usar invocaciones en la DLL, que especificamos para el marco (no como referencia), podemos crear código para recuperar datos. Pero ahora tenemos que hacer esto por linq. ¿Cómo podríamos crear una consulta como:

var q = from customer in m.Customer
        select new
        {                   
            customer.Number,
            customer.City,
            customer.CountryEntity.Name             
        };

sólo de cadenas. Tendríamos 1 cadena llamada " customer " por lo que sabemos que tenemos que recuperar del Cliente. Entonces tendríamos una cadena [] que contiene los nombres de campo que queremos recuperar. Como puede ver, estas columnas podrían incluir tipos complejos (campos relacionados).

¡Cualquier consejo, especialmente en combinación con LLBLGen, sería genial!

Gracias, Gab

¿Fue útil?

Solución

No estoy seguro de si esto es exactamente lo que está buscando, pero Scott Gu tiene una publicación en su blog sobre el uso de LINQ dinámico. http://weblogs.asp.net/scottgu/archive/2008/ 01/07 / dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Puede que no haga todo lo que necesitas, pero puede que te ayude en algo.

EDITAR. Solo estaba mirando un código de muestra que tenía Scott Gu, y descubrí que puede hacer la parte seleccionada que necesitas. Ejemplo (este es el código Scotts):

Dim query = db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10). _
                OrderBy("CompanyName"). _
                Select("New(CompanyName as Name, Phone)")

Como puede ver, el bit inferior tiene una selección dinámica.

También para resolver el problema de saber de forma dinámica qué objeto consultar en tiempo de ejecución, podría hacer algo como esto:

 Sub query(Of T)(ByVal Myobject As IQueryable(Of T))
    Dim i = Myobject.Select("New(customer.Number)")
 End Sub

Luego, solo puede hacer un pequeño cambio después de leer los nombres de la base de datos, de este modo:

Sub PassIt()
    Dim name = "customer"
    Select Case name
        Case "customer"
            query(m.Customer)
    End Select
End Sub

Espero que esto ayude. ¡Nota! Habría una mejor manera de hacer la última parte (método passit) pero es temprano en la mañana para pensar en ello.

Lo siento, la respuesta está en VB, debería haberlo hecho en C #

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top