IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

LinqExtension besoin d'aide pour en créer une


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut LinqExtension besoin d'aide pour en créer une
    Bonjour à tous,

    Je suis face à un sérieux problème et je n'arrive vraiment pas à le résoudre. Malgré les exemples du net, il m'est impossible d'arriver au résultat escompté.

    J'ai besoin d'assigner des propriétés calculées dans une requete Linq à mon résultat.

    Le contexte : une requete Linq to Entity Framework de type ObjectQuery(Of MON_ENTITY)
    J'ai étendu mon entity avec une classe partielle pour lui ajouter deux propriétés.
    Le besoin : effectuer une requete pour récupérer la liste d'entity dont les deux propriétés auront été remplies par des sous requetes.
    Typiquement on peut imaginer une entity Catégorie avec une propriété NombreProduits. Donc la requete donnerai quelque chose comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from c as Categorie in Db.Categories
    Select c, c.Produits.Count
    Mais cela me retourne un anonymous type qui ne m'arrange guère. En effet, ma requete typée ObjectQuery(Of Categorie) est passée en paramètre de deux fonctions permettant respectivement de réaliser les includes, et de faire un filtrage selon critères. Or le retour étant de type anonymous, le cast en objectquery(of categorie) ne passe pas.

    J'ai rencontré sur le net une source qui montrait comment affecter une valeur à l'intérieur de la requete elle meme.
    Cela donnait quelque chose comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from c as Categorie in Db.Categories
    Select c.SetProperty(function(cat) cat.NombreProduits = c.Produits.Count)
    Malheureusement je n'ai jamais réussi à faire fonctionner l'extension car je pense qu'elle a été codée pour du linq to objects.

    Auriez vous une idée de comment réaliser ce genre d'extension svp ? ou même un point de départ qui me permettrait de démarrer une extension linq to EF qui fonctionne.

    J'ai pu croiser une méthode mais qui nécessitait de modifier une partie du fichier EDMX, ce qui n'est pas concevable car il est autogénéré à chaque mise à jour de base de données.

    Merci d'avance

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    pas sûr d'avoir tout compris

    pour le problème du type anonyme, tu peux créer une classe avec 2 propriétés et dans le linq faire un
    select new maclasse with{.prop1=c,.prop2=c.produits.count}
    la collection de retour sera ainsi typée

    pour une propriété coté .net qui serait une propriété calculées, tu dois pouvoir étendre la classe (partial classe je pense, ou sinon une fonction en extension), rajouter la propriété et après il y a 2 possibilités, la plus simple faire un return me.produits.count
    l'autre pour avoir la valeur en ram, avec un calcul en cas de mise à jour de la collection produit, mais il faudrait un observablecollection, et ca n'est pas forcément simple sur EF je crois

    après on peut aussi se demander pourquoi tu as besoin d'une propriété qui retourne juste un .count, tu peux le faire quand tu en as besoin sans créer de propriétés via produits.count
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Beh en fait, c'est pour pouvoir faire du chargement déporté. Imagines, tu as une liste de catégories assez lourde. Dans chaque catégorie tu as une liste de produits plutot conscéquente. Perso, je ne m'amuse pas à charger la totalité de l'arbre Categories/Produits pour seulement afficher la liste de catégories avec le nombre de produits à coté. Je vais charger la liste des catégories et pour chaque catégorie, je veux avoir le nombre de produits calculé si possible en "one shot" dans la requete linq to EF.
    parce que bon, ca serait assez simple de faire un for each categ calcule moi le nombre et stocke le dans la propriété mais ca veut dire faire autant de requetes que de catégories... Pas valable.
    Donc mon idée a été d'étendre l'entity en lui ajoutant la propriété calculée et dans la requete EF to linq, faire ce calcul et éventuellement pouvoir l'assigner en même temps.
    je n'utilise pas les types anonymes ni meme une classe qui serait au dessus de l'entity comme tu l'indiques avec une propriété pour l'entity et une propriété pour le nombre car j'ai besoin de compléter mon ObjectQuery avec d'autres éléments. Ces éléments proviennent d'un système assez complexe permettant de réaliser les includes nécessaires pour récupérer les entity liées souhaitées ainsi qu'un autre systeme permettant de filtrer les résultats directement dans la requete.

    Grosso modo ca donnerai un truc du genre :
    1) je fais ma requete de base (from c in db.categories select c)
    2) req = req à laquelle j'applique des includes pour récupérer les entity liées
    3) req = req à laquelle j'applique des clauses where et compagnie pour filtrer le résultat
    4) return req.tolist => là la requete sql est executée, tout se passe coté serveur et je ne récupère que les données nécessaires.

    Les points 2 et 3 sont des fonctions attendant des objectQuery(of) fortement typées, c'est pour cela que je ne veux pas passer par autre chose que mes entity, car tout est déjà pris en considération pour chacune d'entre elle et j'aimerai éviter les exceptions dans la structure du projet.

    Donc la seule solution serait de créer cette foutue extension linq to EF mais je n'arrive pas à adapter l'exemple que j'ai trouvé (exemple que je n'arrive pas à retrouver...)

Discussions similaires

  1. [11g] Besoin d'aide pour écriture d'une requête
    Par telchargement dans le forum SQL
    Réponses: 3
    Dernier message: 19/04/2013, 11h05
  2. [ZF 1.11] Besoin d'aide pour débloquer sur une appli
    Par geant_boy dans le forum Zend Framework
    Réponses: 7
    Dernier message: 16/06/2011, 16h49
  3. Réponses: 2
    Dernier message: 22/07/2009, 22h36
  4. Réponses: 0
    Dernier message: 02/04/2008, 20h29
  5. Besoin d'aide pour créer une BD
    Par desfrags dans le forum Débuter
    Réponses: 6
    Dernier message: 30/01/2008, 22h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo