2009-09-07 4 views
0

J'ai un objet IQueryable qui est le résultat de la vue (en utilisant un modèle de données dans Visual Studio).Linq-to-SQL - Empêche l'exécution de la requête par la base de données

Je souhaite appliquer un filtre supplémentaire sur l'objet, mais je ne souhaite pas qu'il retourne à la base de données et réexécute la requête avec la clause where supplémentaire. La requête prend plusieurs secondes et je voudrais que linq filtre simplement la liste actuelle plutôt que de régénérer la requête. Comment puis-je empêcher linq to sql de revenir à la base de données lorsque j'exécute une fonction .where()?

Répondre

2

utilisez ToList() après la première exécution et utilisez la liste générée dans le reste de votre code.

var products = (from p in Products where p.Name.Contains("k") select p).ToList(); // this will go to database and fill the products list. 

var x = products.Where(p => p.ProductionDate > DateTime.Now); // this will run in memory. 
3

Pour répondre à la titre de la question, vous pouvez généralement utiliser AsEnumerable pour faire exécuter localement bits suivants:

var query = db.People 
       .Where(p => p.Age > 18) // In database 
       .AsEnumerable() 
       .Where(p => p.Name == "Jon") // In .NET 

L'appel à AsEnumerable ne fait rien d'autre que de changer l'électricité statique tapez de IQueryable<T> à IEnumerable<T> de sorte que les méthodes d'extension dans Enumerable soient appelées à la place de celles dans Queryable.

Toutefois, si vous réutilisez une requête qui a déjà exécuté, il sera toujours à nouveau exécuter dans la base de données ... donc (pour répondre corps de la question) si vous souhaitez réutiliser résultats d'une requête, vous besoin de les convertir en une liste d'abord, par exemple

var results = db.People 
       .Where(p => p.Age > 18) 
       .ToList(); 

ensuite accéder results ne va pas revenir à la base de données (sauf si elle a besoin d'aller chercher des valeurs de l'enfant, bien sûr). Donc, vous pouvez faire:

var subquery = results.Where(p => p.Name == "Jon"); 

Cela va effectuer le filtrage en cours à la place.

+0

Je suis nouveau sur dot whats la différence entre IQueryable et Ienumerable – Edwards

+0

'IQueryable' représente une requête en termes de * arbres d'expression * - fondamentalement il est utilisé pour traduire des requêtes de logique .NET à SQL etc.' IEnumerable' est juste une séquence d'éléments. La raison pour laquelle cela importe ici est de savoir quelle méthode d'extension est sélectionnée quand vous appelez 'Where' etc. -' Enumerable' convertit une expression lambda en un délégué, alors que 'Queryable' la convertit en une arborescence d'expression. –

Questions connexes