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

Linq Discussion :

Requete sur un resultat d'une requete


Sujet :

Linq

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Requete sur un resultat d'une requete
    J'ai une fonction Fonction1() qui me retourne le resultat d'une requete linq:

    Dim rq = From Contrats In dtct.Contrats _
    Join Request In dtct.Request.Where(rqType) On Request.RqID Equals Contrats.CtrRequestId _
    Where Request.RqAptID = aptID _
    And Contrats.CtrNumContrat <> 0 _
    And Contrats.CtrFraisAgence > 0 _
    Select Contrats.CtrRequestId, Contrats.CtrNumContrat, Request.RqStart, Request.RqEnd, Contrats.CtrTotal1, Contrats.CtrSecuDep, Contrats.CtrAgFeeSnsTva


    Return rq
    ce qu'il m'interesse c'est de faire une requete sur la valeur de retour de cette fonction1()


    dim resultat = fonction1()

    resultat = From req in resultat select CtrNumContrat, RqStart, RqEnd

    le code que j'ai mis au-dessus ne marche pas biensure,
    ca me donne l'erreur: L'expression de type 'object' ne peut pas etre interrogee.

    Merci d'avance pour l'aide

  2. #2
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    bonjour,

    tu es en mode strict = Off, non ?

    un mauvais point

    change ton retour de fonction, ca doit etre, de memoire, un IQueryable

    (moi pas pro en Linq, donc...a prendre avec des pincettes au second degré )

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par vaxxx Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim resultat = fonction1()
     
    resultat = From req in resultat select CtrNumContrat, RqStart, RqEnd
    Déjà dans ce code, il ne faudrait pas plutôt faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim resultat = fonction1()
    
    resultat = From req in resultat select req.CtrNumContrat, req.RqStart, req.RqEnd
    Sinon si tu as un problème avec les types, tu peux par exemple faire retourné à ta fonction "Fonction1" un array ou une liste, en ajoutant simplement des parenthèses autour de la requête linq, suivies de .toArray, ou .toList : (Certainement pas la meilleure solution, mais s'en est une je pense)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim rq = (From Contrats In dtct.Contrats _
    Join Request In dtct.Request.Where(rqType) On Request.RqID _
    Equals Contrats.CtrRequestId _
    Where Request.RqAptID = aptID _
    And Contrats.CtrNumContrat <> 0 _
    And Contrats.CtrFraisAgence > 0 _
    Select Contrats.CtrRequestId, Contrats.CtrNumContrat, _
    Request.RqStart, Request.RqEnd, Contrats.CtrTotal1, _
    Contrats.CtrSecuDep, Contrats.CtrAgFeeSnsTva).ToArray
    
    
    Return rq

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    le probleme c'est que je ne peux pas changer la valeur de retour de fonction1() car elle est utilise par d'autre fonction, ceci impliquerai plein de changement.

    Si je fait ca:

    Dim rq = From Ctr In dtct.Contrats _
    Join req In dtct.Request On Ctr.CtrRequestId Equals req.RqID _
    Where req.RqAptID = aptID _
    Select req.RqID, Ctr.CtrNumContrat, req.RqStart, req.RqEnd, Ctr.CtrTotal1, Ctr.CtrSecuDep

    Dim rq2 = From result In rq _
    Select result.CtrTotal1, result.CtrNumContrat



    Return rq2
    il n'y a aucun probleme, des que j'essaie de mettre la premiere requete "rq" dans fonction1() et j'utilise sa valeur de retour, vs me dit qu'il est impossible d'interoge l'objet :/

    j'ai essaye avec iqueryable mais pour l'utilise j'ai besoin de definir un type: IQueryable(of <classe>) sachant que rq est une jointure de deux table, j'ai aucune idee comment le faire

  5. #5
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    yop,
    tu peux créer une nouvelle classe regroupant soit les classes de tes tables (construites à partir de tes tables), soit en reconstruire une avec les proprietes que tu veux retrouver avec ta requete.
    Dans tous les cas je pense que t'es obligé de retourner un IQueryable pour fonction1(), ainsi la requete n'est pas executée; elle le sera quant tu ajouteras .ToList ou ToArray ou FirstOrDefault ou ... (enfin la liste est longue). Cette solution te permet d'executer ta requete quant tu le souhaite dans le code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function Mareq(... ) as IQuerryable (of MonObjet)
    rq=(from Ctr in dtct.Contrats join ... where ... select New MonObjet(..., ...., ...., ...., ....) )
    return req
    end function
    ......
    ......
    dim req as .... = from res as mareq().toList select ....
    Comme ceci, avec de bonnes déclarations, qqs propriétés, et ça devrait aller.

    Allez, un exemple vaut mieux que mille mots :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Retour As IQueryable(Of LAbo) = From Ligne In DC.LAbo
             If {condition par exemple} Then
                Retour = From ligne In Retour Where ligne.DateF > Config.Now
             End If
             Return Retour.ToArray

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    comment je dois faire pour declarer une class qui fusionne mes deux classes contrats est request pour que ma fonction1() as iqueryable(of MaClasse) puisse faire un cast de la requete en iqueryable(of MaClasse)

    j'ai une erreur:
    Impossible d'effectuer un cast d'un objet de type 'System.Data.Linq.DataQuery`1[VB$AnonymousType_16`7[System.Int32,System.Nullable`1[System.Int32],System.Nullable`1[System.DateTime],System.Nullable`1[System.DateTime],System.Nullable`1[System.Single],System.Nullable`1[System.Single],System.Nullable`1[System.Single]]]' en type 'System.Linq.IQueryable`1[RsltCtrReq]'.

  7. #7
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Class Concat
       'proprietes
       '----------
       Public Ctr As Contrat
       Public req As Request
     
       Public Sub New(ByVal _ctr As Contrat, ByVal _req As Request)
          Ctr=_ctr
          req=_req
       End Sub
     
    End Class
    La requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (from LignCtr as contrat _
    join lignReq as Requete on lignCtr.type equals lignReq.type _
    where .... _
    select new Concat(lignCtr, lignReq)).toQQCHOSE
    Voila en grosso modo qui devrait t'aider.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    il veut toujours pas caster en iqueryable(of Concat).

    Mais c'est bon, j'ai réussi a convaincre mon chef de projet de faire une simple requête, parce qu'il voulait a tous prix réutiliser le résultat de l'autre requête :/

    Merci quand meme

  9. #9
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    Une solution rapide c'est toujours mieux que bloquer sur un problème, c'est sur. Mais si tu veux qu'on essaye de trouver tout de même une solution, alors pourrais-tu envoyer ton code?

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    ma classe concat:
    Public Class Concat
    'proprietes
    '----------
    Public Ctr As Contrats
    Public req As Request

    Public Sub New(ByVal _ctr As Contrats, ByVal _req As Request)
    Ctr = _ctr
    req = _req
    End Sub

    End Class

    La premiere requete:

    Function getContrat2(ByVal aptID As Integer) As IQueryable(Of Concat)



    Dim rq = (From LignCtr In dtct.Contrats _
    Join lignReq In dtct.Request On lignReq.RqID Equals LignCtr.CtrRequestId _
    Where lignReq.RqAptID = aptID _
    And LignCtr.CtrNumContrat <> 0 _
    And LignCtr.CtrFraisAgence > 0 _
    Select New Concat(LignCtr, lignReq)).ToArray
    Return rq

    End Function
    ici j'ai une erreur : Impossible d'effectuer un cast d'un objet de type 'Concat[]' en type 'System.Linq.IQueryable`1[Concat]'.

    par contre la fonction getContrat2() doit faire un :
    Select Contrats.CtrRequestId, Contrats.CtrNumContrat, Request.RqStart, Request.RqEnd, Contrats.CtrTotal1, Contrats.CtrSecuDep, Contrats.CtrAgFeeSnsTva

    c'est important car elle est utilise plusieurs fois par d'autres fonctions, je ne peut pas manipuler une jointure de deux tables entiere car elles sont immenses (en nombre de colonnes)

    et enfin la fonction qui devrait en teorie faire un select sur le resultat de getContrat2()
    Function getExtractLoyer(ByVal aptID As Integer)

    Dim rq = getContrat2(aptID)

    Dim rq2 = From result In rq Select result.Ctr.CtrRequestId, result.Ctr.CtrNumContrat, result.req.RqStart, result.req.RqEnd, result.Ctr.CtrTotal1, result.Ctr.CtrSecuDep

    Return rq2.ToArray

    End Function

  11. #11
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    Impossible d'effectuer un cast d'un objet de type 'Concat[]' en type 'System.Linq.IQueryable`1[Concat]'.
    Normal, tu fais un Toarray a la fin...

    Si tu fais la meme chose sans le ToArray, ca risque de mieux marcher

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Ca marche

    par contre getContrat2() me renvoi une jointure des deux tables Contrats et requete entiere... c'est possible de faire un select pour que dans la valeur de retour il n'y ai uniquement les colonnes desquelles j'ai besoin? comme je vous l'ai dit la table requete est tres grande est la manipulation de la table entiere est longue

  13. #13
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    yop!
    le type IQueryable nécessite que tu ne fasse pas de .ToArray (ou autre) qui execute la requete. Ce type est fait expres pour ne pas excuter tout de suite la requete. Le principe est un peu le même pour les requetes paramétrer: on les definit puis on les execute.
    Enfin en linq ce que je trouve pas mal (prometteur ?!), c'est que dans ton select tu peux instancier un objet.
    Tu peux donc faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select New Concat(tonCtr (ou ta ligne dans la requete :) ), ligneRequest.idreq, lignerequest.libelreq, ...)
    Si je reprends l'exemple de concat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Class Concat
    'proprietes
    '----------
    Public Ctr As Contrats
    Public Idreq As Request
    Public LibelReq as string
     
    Public Sub New(ByVal _ctr As Contrats, ByVal _IdReq As integer, _Libelreq as string, ...)
    Ctr = _ctr
    idreq = _idreq
    libelReq=_libelreq
    End Sub
     
    End Class
    J'espère que ça a put t'aider.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci pour l'aide les gars

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete sur un resultat d'une requete
    Par pelloq1 dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/07/2008, 12h38
  2. Réponses: 19
    Dernier message: 14/12/2006, 14h21
  3. Réponses: 2
    Dernier message: 31/05/2006, 09h47
  4. Execution d'une requete sur un resultat précédent
    Par Systemic7 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/08/2005, 14h43
  5. substr sur le $resultat d'une requete
    Par grellierj dans le forum Langage SQL
    Réponses: 12
    Dernier message: 21/01/2005, 11h28

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