190 messaggi dal 09 novembre 2005
Ciao a tutti,
mi sto ponendo una domanda, magari idiota (ma anche no).
Sto facendo un porting da VB6 a C# FW4.0, nell'approccio del "vecchio" codice, si è adottato la classica composizione della query SQL, in modo graduale in base a delle condizioni:

Classico esempio da VB6

Dim Sql as String
Sql = "SELECT * FROM TABELLA "

If MioParametro Then
  Sql = Sql & "WHERE CAMPO = 'valore'"
Else
  [...]
End If


Ora mi domando come poter ottenere la stessa "flessibilità" nella composizione della query con Linq.

Istintivamente scriverei le query Linq per ogni combinazione di condizioni, ma è troppo verboso.

Se applico alla mia IQuarable<T> una serie metodi di Where (per ogni condizione positiva) non so se sia ottimale.

Qualcuno sa indicarmi la via per l'illuminazione? :-)
190 messaggi dal 09 novembre 2005
Ho trovato LinqKit, molto interessante.
Nel caso in cui ho diverse condizioni che influiscono sulla composizione della query è molto utile.

Ma nel caso semplice non credo abbia molta utilità, in quanto le righe aumentano e non è più molto leggibile il codice.

Invece se banalmente riscriviamo la query nei deu casi è di fatto estremamente leggibile.

Quindi penso che applicherò LinqKit solo nei casi in cui ho più di una condizione da dover gestire, altrimenti approccio banale.

Che ne pensate?

NOTA IMPORTANTE: Ho controllato con SQL Server Profiler, le query generate sono identiche (non si sa mai....)

Esempio:

IQueryable<ARTICOLI> items;

//****************
//CASO con LinqKit
//****************
Expression<Func<ARTICOLI, bool>> filtroCategoriaMerceologica = rec => rec.CATEGORIA_MERCEOLOGICA == pCategoriaMerceologica.Codice;

//Applico l'eventuale filtro sugli obsoleti
Expression<Func<ARTICOLI, bool>> finalFilter;
if (pMostraObsoleti)
  finalFilter = filtroCategoriaMerceologica;
else
  finalFilter = rec => filtroCategoriaMerceologica.Invoke(rec) && rec.ARTICOLO_OBSOLETO == false;

items = from rec in Ctx.ARTICOLI.Include("R_CATEGORIA_MERCEOLOGICA")
                .AsExpandable()
                .Where(finalFilter)
    orderby rec.ARTICOLO
    select rec;

//***************************
//CASO con Linq senza LinqKit
//***************************
if (pMostraObsoleti)
    items = from rec in Ctx.ARTICOLI.Include("R_CATEGORIA_MERCEOLOGICA")
            where rec.CATEGORIA_MERCEOLOGICA == pCategoriaMerceologica.Codice
            select rec;
else
    items = from rec in Ctx.ARTICOLI.Include("R_CATEGORIA_MERCEOLOGICA")
            where rec.CATEGORIA_MERCEOLOGICA == pCategoriaMerceologica.Codice &&
                  rec.ARTICOLO_OBSOLETO == false
            select rec;

Modificato da dakyn77 il 13 ottobre 2016 10.53 -
Modificato da dakyn77 il 13 ottobre 2016 10.53 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
le query LINQ sono già componibili di per sé e quindi puoi raffinarle in istruzioni successive. E' ancora più compatto se usi l'extension method .Where, così non devi ripetere from rec in ... select rec.

Guarda questo esempio che non usa LINQ Kit:
var items = from rec in Ctx.ARTICOLI.Include("R_CATEGORIA_MERCEOLOGICA")
            where rec.CATEGORIA_MERCEOLOGICA == pCategoriaMerceologica.Codice
            select rec;

if (!pMostraObsoleti)
  items = items.Where(i => !i.ARTICOLO_OBSOLETO)

//ottengo i risultati
var risultati = await items.ToListAsync();


In questo caso, il predicato che è nella seconda Where, quella in cui filtro gli obsoleti, andrà in AND con quella sopra, che invece era servita a filtrare per categoria merceologica.

LINQ Kit secondo me è un'ottimo strumento e lo puoi usare quando devi costruire predicati con una logica più complessa. In questo caso puoi farne a meno.

ciao,
Moreno

Enjoy learning and just keep making
190 messaggi dal 09 novembre 2005
Ah! Molto più semplice!!! Ingenuamente non l'ho proprio considerato. Grazie mille.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.