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

Silverlight Discussion :

RIA et requête linq !


Sujet :

Silverlight

  1. #1
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut RIA et requête linq !
    Bonjour à tous,

    J'ai besoin de faire une requête Linq qui me retourne la dernière position en date de chacun de mes véhicule et je vois pas trop comment m'y prendre.

    J'ai une liste de véhicules dont j'enregistre dans ma BDD leurs positions à intervalle régulier. Quand le client se connecte, il voit s'afficher sur une map l'ensemble de ses véhicules, situés sur la map grâce à la dernière position enregistrée.

    Je me dis qu'il n'ai pas nécessaire que je retourne au client l'ensemble des point si c'est pour me servir uniquement du dernier en date.

    Dans mon DomainService, j'ai donc une 1ère fonction qui me retourne la liste des véhicule du client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public IQueryable<Vehicule> GetVehiculeByCustomers(int _customerID) {
     
                var _vehiculeList = from _vehicule in this.DataContext.VEHICULES
                                 where _vehicule.CU_ID == _customerID
                                 select _vehicule;
     
                return _vehiculeList ;
            }
    Ensuite c'est là que je me pose des question :

    Est-il possible de retourner dans la même requête ci dessus les véhicule et les dernières position en date ?

    Dois - je plutôt utiliser une autre requête du style ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     public List<POSITIONDETAIL> GetLastPOSITIONDETAILByVEHICULE(IQueryable<VEHICULE> _vehiculeList) {
                var _positionDetailList = new List<POSITIONDETAIL>();
     
                foreach (VEHICULE _vehicule in _vehiculeList)
                {
                    //Comment faire pour que dans cette liste je ne récupère que la dernière position en date ??
                    var _lastPositionDetail = from _positionDetail in this.DataContext.POSITIONDETAILs where _positionDetail.VEHICULE_ID == _vehicule.VEHICULE_ID select _positionDetail;
     
                    _positionDetailList.Add(_lastPositionDetail);
                }
     
                return _positionDetailList;
            }
    Le truc c'est que comme la table POSITIONDETAIL va très vite comprendre beaucoup d'enregistrement, j'aimerai optimiser les requêtes sur cette dernière au maximum, et je ne suis pas encore vraiment à l'aise avec toutes les possibilité de Linq, notamment les sort(), where(), first() ...

    Cordialement MoZo

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Dans l'idée, il faudrait faire un groupby la voiture et selectionner la ligne avec le max dans la date.
    Mais j'ai pas ce qu'il faut sous la main pour le faire...

  3. #3
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Merci à toi Nathanael !

    Je pense avoir trouvé une solution pas mal. J'ai créé une propriété nullable de type POSITIONDETAIL dans mon model dans ma table Vehicule, et ensuite lors de ma requête coté serveur je recherche la dernière position en date et je l'insère dans ma propriété ! Je vous montre !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
            //Return all the Vehicule of the customer's parameter 
            public IQueryable<VEHICULE> GetVehiculesByCustomers(int _customerID) {
     
                var _vehiculesList = from _vehicule in this.DataContext.Vehicules
                                 where _vehicule.CU_ID == _customerID
                                 select _vehicule;
     
                foreach (BOX _vehicule in _vehiculesList)
                {
                    //Foreach Vehicule in the previous list, we just take the latest POSITIONDETAIL 
                    _vehicule.POSITIONDETAIL = _vehicule.POSITIONDETAILs.OrderBy(a => a.PD_DATE).First();               
                }
     
                return _vehiculesList;
            }
    Ça à l'air de marcher , merci pour l'inspiration, faut que je me mette à bosser tout ces opérateurs Linq

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Malheureusement, bien que ta requête marche, elle est loin d'être optimisée!
    Si tu as 10000 véhicules dans ta table, tu vas faire 10001 requêtes!
    Bienvenue dans le piège du lazy-loading et des requêtes n+1.

    L'astuce est soit de faire une meilleure requête, soit faire une jointure explicite via la directive Include

  5. #5
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Merci Nathanael

    L'astuce est soit de faire une meilleure requête, soit faire une jointure explicite via la directive Include
    tu pourrais expliciter un peu stp ?

    Cordialement MoZo

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Alors soit avec une requête un peu plus poussée en linq tu te débrouilles pour tout remonter d'un coup ou alors tu utilises ca:
    http://msdn.microsoft.com/en-us/library/bb738708.aspx

  7. #7
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Ok merci je vais jeter un petit coup d'oeil au lien !

    Sinon, une petite questio annexe car il y a des choses que ne comprend pas vraiment. Après une LoadOperation qui me retourne ma liste de voitures. Je veux récupérer une voiture dans la liste en fonction de son ID. J'arrive à le faire de cette manière mais je ne trouve pas ça terrible d'être obliger de faire une boucle...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach (VEHICULE _vehicule in VehiculeLoadOperation.Entities)
    	        {
    		        if (_vehicule.vehicule_ID == UnVehiculeID)
    	            {
    		             SelectedVehicule = _vehicule;
    	            }
    	        }
    N'y aurais t-il pas un moyen plus simple/propre de le faire avec l'opérateur where ?? Un truc dans ce genre là ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<Vehicule> _listVehicule = (List<Vehicule>)VehiculeLoadOperation.Entities;
                var _monVehicule = ListVehicule.Where(a => a.BOX_ID == _boxId).Single();


    Là ne le cast en List<Vehicule> ne passe pas mais c'est impossible de faire ça sur un IEnumerable ??

Discussions similaires

  1. Requête linq jointure
    Par oyigit dans le forum Linq
    Réponses: 5
    Dernier message: 18/03/2010, 16h02
  2. Réponses: 0
    Dernier message: 29/04/2009, 16h35
  3. Réponses: 7
    Dernier message: 06/04/2009, 16h29
  4. Colle sur un tri dans une requête linq to sql
    Par boby62423 dans le forum Linq
    Réponses: 5
    Dernier message: 18/03/2009, 10h01
  5. Réponses: 7
    Dernier message: 10/02/2008, 11h56

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