Domanda

Dobbiamo generare query LINQ sconosciute al 100% durante la codifica (tempo di progettazione). Questo perché la logica è disponibile nel nostro framework, che è separata al 100% da qualsiasi progetto di dati. Per i dati utilizziamo il codice di accesso ai dati generato da LLBLGen.

Normalmente usando invoke sulla DLL, che specifichiamo al framework (non riferimento) possiamo creare codice per recuperare i dati. Ma ora dobbiamo farlo con Linq. Come possiamo creare una query come:

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

solo dalle stringhe. Avremmo 1 stringa chiamata " cliente " quindi sappiamo che dobbiamo recuperare dal cliente. Quindi avremmo una stringa [] contenente i nomi dei campi che vogliamo recuperare. Come puoi vedere, queste colonne potrebbero includere tipi complessi (campi correlati).

Qualsiasi consiglio, specialmente in combinazione con LLBLGen, sarebbe fantastico!

Grazie, Gab

È stato utile?

Soluzione

Non sono sicuro se questo è esattamente quello che stai cercando, ma Scott Gu ha un post sul suo blog sull'utilizzo di LINQ dinamico. http://weblogs.asp.net/scottgu/archive/2008/ 07/01 / dinamico-LINQ-parte-1-con-il-LINQ-dinamico-query-library.aspx

Potrebbe non fare tutto ciò di cui hai bisogno, ma potrebbe aiutarti.

EDIT. Stavo solo dando un'occhiata ad un codice di esempio che Scott Gu aveva, e ho scoperto che può fare la parte selezionata di cui hai bisogno. Esempio (questo è il codice di Scotts):

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

Come puoi vedere, il bit in basso ha una selezione dinamica.

Inoltre, per risolvere il problema di sapere dinamicamente quale oggetto interrogare in fase di esecuzione, potresti fare qualcosa del genere:

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

Quindi potresti fare un piccolo cambio dopo aver letto i nomi dal database, in questo modo:

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

Spero che questo aiuti. Nota! Ci sarebbe un modo migliore di fare l'ultima parte (metodo passit) ma è troppo presto per pensarci.

Mi dispiace che la risposta sia in VB avrei dovuto farlo in C #

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top