Nous allons illustrer la différence à l'aide de sql server profiler pour voir la grandeur de IQueryable,
lorsque nous exécutez le code suivant:
MarketDevEntities db = new MarketDevEntities();
IEnumerable<WebLog> first = db.WebLogs;
var second = first.Where(c => c.DurationSeconds > 10);
var third = second.Where(c => c.WebLogID > 100);
var result = third.Where(c => c.EmailAddress.Length > 11);
Console.Write(result.First().UserName);
Dans le générateur de profils SQL, nous trouvons une commande égale à:
"SELECT * FROM [dbo].[WebLog]"
C'environ 90 secondes pour exécuter un bloc de code à l'encontre du Blog la table de qui a 1 million de record.
Donc, tous les enregistrements de la table chargée en mémoire, comme les objets, puis avec chaque .Où (), ce sera une autre filtre dans la mémoire à l'égard de ces objets.
Lorsque nous utilisons IQueryable
au lieu de IEnumerable
dans l'exemple ci-dessus(Deuxième ligne):
Dans le générateur de profils SQL, nous trouvons une commande égale à:
"SELECT TOP 1 * FROM [dbo].[WebLog] WHERE [DurationSeconds] > 10 AND [WebLogID] > 100 AND LEN([EmailAddress]) > 11"
C'environ 4 secondes pour exécuter ce bloc de code à l'aide d' IQueryable
.
IQueryable ont une propriété appelée Expression
stocker de l'arbre de l'expression qui, au départ, formé lorsque nous avons utilisé l' result
dans notre exemple(ce qui est appelé l'exécution différée), à la fin de cette Expression sera convertie à la requête SQL à exécuter sur le moteur de base de données.