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 :

Comment faire une jointure "inégale" [Débutant]


Sujet :

Linq

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut Comment faire une jointure "inégale"
    Bonjour,

    Je début avec Linq ne faisait jusqu'ici que des requêtes très basiques du genre From...Where...Select....

    Aujourd'hui, pour un besoin plus spécifique, je décide de pousser plus avant et souhaite faire des jointures.

    Tant que la clause JOIN que j'aurais écrite en SQL utilise l'opérateur d'égalité, pas de souci. Mais comment faire lorsqu'il faut utiliser les opérateurs d'inégalité ?

    Typiquement, je voudrais réécrire en Linq ce genre de requête SQL :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT *
    FROM A INNER JOIN B ON A.ColumnX < B.ColumnX
    Kropernic

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Ce n'est pas faisable directement comme en SQL. Mais ça n'est pas réellement un problème puisque tu peux le faire dans le Where. Voici un exemple pris sur le net :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var zipCodes = 
        from z1 in zipCodes
        from z2 in zipCodes.Where(x => x.stateCode = "WA")
        where z1.zipCode < z2.zipCode
        select new
        { };
    Il est aussi possible de multiplier les Where si besoin bref il faut parfois s'éloigner de l'approche purement SQL.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Oki doki !

    Juste pour être sûr vu que c'est ma première fois (), ceci est-il correct ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    From r1 In Ranges
    From r2 In Ranges
    Where r1.Debut >= r2.Debut And r1.Fin <= r2.Fin
    Select id1 = r1.Id, id2 = r2.Id, r2.Debut, r2.Fin, r2.Type
    Où Range est la classe suivante :
    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
    17
    Public Class Range
        Public Property Id As Guid
        Public Property Debut As Decimal
        Public Property Fin As Decimal
        Public Property Type As TypeRange
        Public Enum TypeRange
             Congé = 1
             Boulot = 2
             Pause = 3
        End Enum
        Public Sub New(debut As Decimal, fin As Decimal, type As TypeRange)
             Me.Id = Guid.NewGuid
             Me.Debut = debut
             Me.Fin = fin
             Me.Type = type
        End Sub
    End Class
    N.B. : Pour le contexte, je suis en train de créer un UserControl pour afficher et éditer un diagramme de Gantt portant sur les heures d'une journée. La classe Range sert à créer les "rectangles" qui sont affichés sur le diagramme avec l'heure en décimale (8:30 = 8,5).

    EDIT : A priori ça fonctionne bien mais je voudrais être sûr de ne pas être passé à côté d'une subtilité.
    Kropernic

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Oui ça semble correct

    [EDIT] Peut-être rajouter Select New Range ...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Oui ça semble correct

    [EDIT] Peut-être rajouter Select New Range ...
    Ah bah là non ^^. Ce n'est pas du tout une range que je retourne. Déjà, y a 2 id's . Ce sont juste des infos que j'ai besoin pour faire le traitement qui va bien (cette requête-là notamment sert à gérer le chevauchement total d'une range sur une autre).
    Kropernic

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Ahh oui au temps pour moi
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

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

Discussions similaires

  1. Comment faire une jointure sur toutes mes tables
    Par vevere dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/03/2011, 14h09
  2. Comment faire une jointure sélective
    Par mobscene dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/12/2006, 07h44
  3. Réponses: 1
    Dernier message: 09/11/2006, 12h08
  4. Comment faire une jointure ?
    Par Terminator dans le forum Langage SQL
    Réponses: 12
    Dernier message: 16/10/2005, 13h26

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