Question

Existe-t-il des implémentations IQueriable pour linq-to-objects qui offrent de meilleures performances que la performance de recherche linéaire O (n) par défaut que vous obtenez lorsque vous appelez myEnumerable.AsQueriable ()?

J'ai consulté http://www.codeplex.com/i4o/ qui offre de meilleures performances, mais semble utiliser des méthodes d'extension sur IndexedCollection plutôt que de demander à IndexedColleciton d'implémenter IQueriable.

Je souhaite conserver mon interface renvoyant IQueriable < T > car je ne veux pas que quiconque sache s’il frappe un cache ou une base de données.

Était-ce utile?

La solution

De manière inhérente, toute requête sur une ressource non indexée (telle qu'une liste ou IEnumerable) sera au mieux O (n) car elle doit parcourir tous les éléments de la liste pour vérifier la condition. Pour obtenir de meilleures performances que O (n), vous devez envisager d’indexer les données sous une forme ou une autre.

Comme vous l'avez mentionné, vous souhaiterez probablement consulter une bibliothèque pour terminer la création de ces index, en particulier si vous souhaitez uniquement exposer IQueryable.

Si une méthode plus manuelle de recherche de données plus performantes vous intéressait, je vous conseillerais donc de consulter des dictionnaires pour effectuer des recherches efficaces par clé ou, éventuellement, pour utiliser des arbres B si vous avez besoin d'effectuer des requêtes de plage. Voici un bon article MSDN sur les données structures, y compris b-arbres si vous êtes intéressé par la théorie derrière elle. De même, NGenerics pourrait être un projet intéressant à regarder.

Autres conseils

vous voudrez peut-être consulter plinq http: // msdn. microsoft.com/en-us/magazine/cc163329.aspx

Une autre solution consisterait peut-être à sauvegarder une base de données d'objets en mémoire, telle que: db4o

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top