Creare una query (LLBLGen) Linq in modo dinamico con le stringhe
-
05-07-2019 - |
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
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 #