Domanda

Faccio sempre più esercizio con Lambda ma non capisco perché a volte un esempio usi .AsQueryable (); che usano IQueryable e qualche volta ometto il .AsQueryable (); e usa IEnumerable.

Ho letto MSDN ma non vedo come "esecuzione di un albero di espressioni" è un vantaggio rispetto a non.

Chiunque può spiegarmelo?

È stato utile?

Soluzione

IQueryable implementa IEnumerable, quindi subito, con IQueryable, puoi fare tutto ciò che puoi fare con IEnumerable. IQueryables si occupa della conversione di alcune espressioni lambda in query sull'origine dati sottostante: potrebbe trattarsi di un database SQL o di un set di oggetti.

Fondamentalmente, di solito non dovresti preoccuparti in un modo o nell'altro se si tratta di un IQueryable o di un IEnumerable.

Altri suggerimenti

Come utente, generalmente non dovresti preoccuparti, riguarda davvero l'implementatore dell'origine dati. Se i fornitori di dati implementano semplicemente IEnumerable, sostanzialmente stai eseguendo LINQ per l'esecuzione degli oggetti, ovvero è in un'operazione di memoria sulle raccolte. IQueryable fornisce all'origine dati la capacità di tradurre l'albero delle espressioni in una rappresentazione alternativa per l'esecuzione una volta eseguita l'espressione (di solito per enumerazione), che è ciò che fanno Linq2Sql, Linq2Xml e Linq2Entities.

L'unica volta in cui riesco a vedere l'attenzione dell'utente finale è se desidera ispezionare l'albero delle espressioni che verrà eseguito, poiché IQueryable espone Expression. Un altro uso potrebbe essere l'ispezione del provider. Ma entrambi questi scenari dovrebbero essere riservati agli implementatori di altri provider di query e vogliono trasformare l'espressione. Il punto di Linq è che non dovresti preoccuparti dell'implementazione dell'esecuzione dell'espressione da usare.

Sono d'accordo con Arne Claassen, ci sono casi in cui è necessario pensare all'impliantatoina sottostante fornita dalle fonti di dati. Ad esempio, controlla questo blog post che mostra come gli SQL generati da IEnumerable e IQueryable siano diversi in alcuni scenari.

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