none
Optimization Linq to object RRS feed

  • Question

  • Bonjour tout le mon,

    De façon générale, il existe des posts traitant des problématiques d'optimisation dans Linq to Object. Mais je n'ai pas encore réussi à trouver des articles qui traitent des problèmes plus "larges".

    En l'occurrence, si on veut formuler une requête linq sur une collection d'objects (de taille très importante: dizaines ou centaines de milliers d'objets), il est indispensable de faire attention à la requête que nous formulons.

    Notamment, au lieu de faire

    requêtes 1 : maCollection.Select(e=>func(e)).Where(e=>condition(e)),

    il faudrait plutot faire

    requêtes 2 : maCollection.Where(e=>condition(e)).Select(e=>func(e))

    Ma question est la suivante : sauriez vous s'il existe des framework, librairies ou tutoriaux qui pemettreraient d'optimisez de telles requêtes ?

    Il existe plein de startégies d'optimisation dans la communauté base de données pour optimiser des requêtes. Est-il possible de s'en inspirer pour optimiser ces requêtes ?

    Merci d'avance :)


    Omar MERROUN Développeur .NET/Consultant Blog : http://merroun.wordpress.com/
    lundi 10 octobre 2011 14:51

Réponses

  • Bonjour,

    Certaines fonctions Linq to Objects sont nativement optimisées en fonction du type d'interface que la collection implémente :

    • Cast : si la collection implémente IEnumerable<T>
    • Count et Contains : si la collection implémente ICollection ou ICollection<T>
    • First, FirtsOrDefault, Last, LastOrDefault, ElementAt, ElementAtOrDefault, Single, SingleOrDefault: si la collection implément IList ou IList<T>

    Il faut aussi faire attention à l'exécution différée. Quand vous écrivez une requête semblable à celle-ci:

    var query = from item in storage select item;
    

    La requête n'est pas exécutée. En revanche elle le sera à chaque fois que query est énumérée dans un foreach par exemple. Dans Linq to Sql et Linq to Entities, il est fondamental de connaitre cette notion car en fonction du besoin on aura tendance à l'utiliser ou pas.

    Cordialement,


    aelassas.free.fr
    lundi 10 octobre 2011 15:36
  • Bonjour,

    Linq est un language de requêtage objet et permet d'abstraire l'écriture de requête. (= C'est juste une bibliothèque permettant de simplifier l'écriture de code pour tout ce qui est parcours recherche).

    Si vous voulez faire des recherches très rapides, vous devez trouver et créer une structure adéquate. Par exemple les IDictionary...

    Dans la théorie absolue, lorsque l'on utilise Linq on ne devrait pas se soucier des performances. En utilisant Linq on recherche en priorité une abstraction et une facilité pour requêter sur des objets. Pour des performances, utilisez les structures et collections adéquates.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    lundi 10 octobre 2011 15:51
    Modérateur

Toutes les réponses

  • Bonjour,

    Certaines fonctions Linq to Objects sont nativement optimisées en fonction du type d'interface que la collection implémente :

    • Cast : si la collection implémente IEnumerable<T>
    • Count et Contains : si la collection implémente ICollection ou ICollection<T>
    • First, FirtsOrDefault, Last, LastOrDefault, ElementAt, ElementAtOrDefault, Single, SingleOrDefault: si la collection implément IList ou IList<T>

    Il faut aussi faire attention à l'exécution différée. Quand vous écrivez une requête semblable à celle-ci:

    var query = from item in storage select item;
    

    La requête n'est pas exécutée. En revanche elle le sera à chaque fois que query est énumérée dans un foreach par exemple. Dans Linq to Sql et Linq to Entities, il est fondamental de connaitre cette notion car en fonction du besoin on aura tendance à l'utiliser ou pas.

    Cordialement,


    aelassas.free.fr
    lundi 10 octobre 2011 15:36
  • Bonjour,

    Linq est un language de requêtage objet et permet d'abstraire l'écriture de requête. (= C'est juste une bibliothèque permettant de simplifier l'écriture de code pour tout ce qui est parcours recherche).

    Si vous voulez faire des recherches très rapides, vous devez trouver et créer une structure adéquate. Par exemple les IDictionary...

    Dans la théorie absolue, lorsque l'on utilise Linq on ne devrait pas se soucier des performances. En utilisant Linq on recherche en priorité une abstraction et une facilité pour requêter sur des objets. Pour des performances, utilisez les structures et collections adéquates.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    lundi 10 octobre 2011 15:51
    Modérateur
  • mmm, d'accord. J'y vois plus clair.

    Merci pour vos réponses.


    Omar MERROUN Développeur .NET/Consultant Blog : http://merroun.wordpress.com/
    mardi 11 octobre 2011 10:14