In questo caso è importante distinguere tra IQueryable<T>
e IEnumerable<T>
. In breve ist. IQueryable<T>
elaborato da un provider LINQ per fornire una query ottimizzata. Durante questa trasformazione non sono supportate tutte le istruzioni C#, in quanto non è possibile tradurle in una query specifica di back-end (ad esempio SQL) o perché l'implementatore non ha previsto la necessità dell'istruzione.
Nel contratto IEnumerable<T>
viene eseguito contro gli oggetti concreti e, pertanto, non verrà trasformato. Pertanto, è abbastanza comune che i costrutti, che sono utilizzabili con IEnumerable<T>
, non possano essere utilizzati con IQueryable<T>
e anche che il IQueryables<T>
supportato da diversi provider LINQ non supportino lo stesso insieme di funzioni.
Tuttavia, vi sono alcune soluzioni alternative (come Phil's answer), che modificano la query. Inoltre, come approccio più generale è possibile tornare a un IEnumerable<T>
prima di continuare con le specifiche della query. Ciò, tuttavia, potrebbe avere un impatto sulle prestazioni, specialmente quando viene utilizzato su restrizioni (ad esempio, clausole). Al contrario, quando si ha a che fare con le trasformazioni, l'impatto sulle prestazioni è molto più piccolo, a volte addirittura inesistente, a seconda della query.
Così il codice di cui sopra potrebbe anche essere riscritto così:
return this.ObjectContext.BranchCostDetails
.AsEnumerable()
.Where(
b => b.TarrifId == tariffId && b.Diameter == diameter
|| (b.TarrifId==tariffId && !string.IsNullOrWhiteSpace(b.Diameter))
||(!b.TarrifId.HasValue) && b.Diameter==diameter
);
NOTA: codice Ths avrà un impatto sulle prestazioni superiori Phil's answer. Tuttavia, mostra il principio.
Perché? Questo codice compila: 'Lista my = new List (); var i = da m nel mio dove! string.IsNullOrWhiteSpace (m) seleziona m; ' –
Può essere compilato, ma non verrà tradotto in SQL da Linq alle entità. * Il metodo 'Boolean IsNullOrWhiteSpace (System.String)' non ha traduzione supportata in SQL. * Lo stesso vale per IsNullOrEmpty. – Phil
Ha senso ... –