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 :

Orderby et thenby qui marchent à moitié


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut Orderby et thenby qui marchent à moitié
    Bonjour,

    Code vb : 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 LstCustFromSoc
            Property IdCust As Integer
            Property ArtCust As HelperCatalogue.CouleurDominante
            Property RefClt As String
        End Class
        Public Shared Function GetCustoms(ByVal soc As Societe, ByVal LesDatas As CatalogueMobilierEntities) As List(Of LstCustFromSoc)
            Try
                Dim Query = (From Custs In LesDatas.CustomAffectations Where Custs.IdSoc = soc.IdSoc Select Custs.IdCustom, Custs.RefClient)
                Dim query2 = (From Ret In Query.ToList Select New LstCustFromSoc With {.IdCust = Ret.IdCustom, .ArtCust = HelperCatalogue.CouleurDominanteCust(Ret.IdCustom, LesDatas), .RefClt = Ret.RefClient})
                Return query2.OrderBy(Function(a) a.ArtCust.LibArticle).ThenBy(Function(b) b.ArtCust.LongArtCust).ThenBy(Function(c) c.ArtCust.LibCouleur).ToList
            Catch ex As Exception
                Return Nothing
            End Try
        End Function
    La suite de ma classe
    Code vb : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Public Class CouleurDominante
            Property IdArticle As Integer
            Property LibArticle As String
            Property LibDim As String
            Property LibCouleur As String
            Property PathCouleur As String
            Property LongArtCust As Integer
            Property ProfArtCust As Integer
            Property HautArtCust As Integer
        End Class
        Public Shared Function CouleurDominanteCust(ByVal IdCust As Integer, ByVal LesDatas As CatalogueMobilierEntities) As CouleurDominante
            Try
                Dim Query = QuiDefCouleurCust(IdCust, LesDatas)
                Dim query2 = (From AE In LesDatas.CustomArticles Where AE.IdCustom = IdCust And AE.IdElem = Query.IdElem And AE.IdCompoGros = Query.IdCompo Select AE).SingleOrDefault
                Dim Ret As New CouleurDominante
                Ret.IdArticle = query2.Custom.IdArt
                Ret.LibArticle = query2.Custom.Article.Libelle
                Ret.LibDim = Helper.GetStrDimension(query2.Custom.Article.Longueur, query2.Custom.Article.Profondeur, query2.Custom.Article.Hauteur)
                Ret.LibCouleur = query2.ComposantCouleur.Couleur.Libelle
                Ret.PathCouleur = PATH_IMG_GROSSISTES & query2.ComposantGrossiste.IdGros & FOLDER_COULEUR & query2.ComposantCouleur.Couleur.ImgCouleur
                Ret.LongArtCust = If(query2.Custom.Article.Longueur.HasValue, query2.Custom.Article.Longueur, 0)
                Ret.ProfArtCust = If(query2.Custom.Article.Longueur.HasValue, query2.Custom.Article.Profondeur, 0)
                Ret.HautArtCust = If(query2.Custom.Article.Longueur.HasValue, query2.Custom.Article.Hauteur, 0)
                Return Ret
            Catch ex As Exception
                Return Nothing
            End Try
        End Function
    Mon problème c'est que dans le 1er bloc de code, le orderby est bien fait, le tri aussi sur LibCouleur mais il ne veut rien savoir sur LongArtCust

  2. #2
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut
    Je viens de faire un petit test à côté et là ça marche
    Code vb : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    Public Class Orderby
        Inherits System.Web.UI.Page
     
        Public Class CouleurDominante
            Property IdArticle As Integer
            Property LibArticle As String
            Property LibDim As String
            Property LibCouleur As String
            Property LongArtCust As Integer
        End Class
        Public Class LstCustFromSoc
            Property IdCust As Integer
            Property ArtCust As CouleurDominante
            Property RefClt As String
        End Class
        Public Class CustomAffectation
            Property IdSoc As Guid
            Property IdCustom As Integer
            Property RefClt As String
            Public Sub New(ByVal pIdSoc As Guid, ByVal pIdCustom As Integer)
                IdSoc = pIdSoc
                IdCustom = pIdCustom
                RefClt = ""
            End Sub
        End Class
        Public Shared Function GetCustoms() As List(Of LstCustFromSoc)
            Try
                Dim CustomAffectations As New List(Of CustomAffectation)
                Dim idSoc1 As Guid = Guid.NewGuid
                CustomAffectations.Add(New CustomAffectation(idSoc1, 6))
                CustomAffectations.Add(New CustomAffectation(idSoc1, 7))
                CustomAffectations.Add(New CustomAffectation(idSoc1, 8))
                CustomAffectations.Add(New CustomAffectation(idSoc1, 9))
                CustomAffectations.Add(New CustomAffectation(idSoc1, 10))
                CustomAffectations.Add(New CustomAffectation(idSoc1, 11))
                CustomAffectations.Add(New CustomAffectation(idSoc1, 12))
                Dim idSoc2 As Guid = Guid.NewGuid
                CustomAffectations.Add(New CustomAffectation(idSoc2, 4))
                CustomAffectations.Add(New CustomAffectation(idSoc2, 5))
                CustomAffectations.Add(New CustomAffectation(idSoc2, 8))
                CustomAffectations.Add(New CustomAffectation(idSoc2, 9))
                CustomAffectations.Add(New CustomAffectation(idSoc2, 10))
     
                Dim Query = (From Custs In CustomAffectations Where Custs.IdSoc = idSoc1 Select Custs.IdCustom, Custs.RefClt)
                Dim query2 = (From Ret In Query.ToList Select New LstCustFromSoc With {.IdCust = Ret.IdCustom, .ArtCust = CouleurDominanteCust(Ret.IdCustom), .RefClt = Ret.RefClt})
                Return query2.OrderBy(Function(a) a.ArtCust.LibArticle).ThenBy(Function(b) b.ArtCust.LongArtCust).ThenBy(Function(c) c.ArtCust.LibCouleur).ToList
            Catch ex As Exception
                Return Nothing
            End Try
        End Function
     
        Public Shared Function CouleurDominanteCust(ByVal IdCust As Integer) As CouleurDominante
            Try
     
                Dim Ret As New CouleurDominante
                If IdCust = 6 Then
                    Ret.IdArticle = 14
                    Ret.LibArticle = "Armoire à  rideaux 5 tablettes"
                    Ret.LibDim = "1200 X 450 X 1980"
                    Ret.LibCouleur = "POIRIER"
                    Ret.LongArtCust = 1200
                ElseIf IdCust = 7 Then
                    Ret.IdArticle = 14
                    Ret.LibArticle = "Armoire à  rideaux 5 tablettes"
                    Ret.LibDim = "1200 X 450 X 1980"
                    Ret.LibCouleur = "BAHIA"
                    Ret.LongArtCust = 1200
                ElseIf IdCust = 8 Then
                    Ret.IdArticle = 14
                    Ret.LibArticle = "Armoire à  rideaux 5 tablettes"
                    Ret.LibDim = "1200 X 450 X 1980"
                    Ret.LibCouleur = "Erable nature"
                    Ret.LongArtCust = 1200
                ElseIf IdCust = 9 Then
                    Ret.IdArticle = 18
                    Ret.LibArticle = "Armoire à  rideaux 5 tablettes"
                    Ret.LibDim = "1000 X 450 X 1980"
                    Ret.LibCouleur = "BAHIA"
                    Ret.LongArtCust = 1000
                ElseIf IdCust = 10 Then
                    Ret.IdArticle = 18
                    Ret.LibArticle = "Armoire à  rideaux 5 tablettes"
                    Ret.LibDim = "1000 X 450 X 1980"
                    Ret.LibCouleur = "Erable nature"
                    Ret.LongArtCust = 1000
                ElseIf IdCust = 11 Then
                    Ret.IdArticle = 18
                    Ret.LibArticle = "Armoire à  rideaux 5 tablettes"
                    Ret.LibDim = "1000 X 450 X 1980"
                    Ret.LibCouleur = "POIRIER"
                    Ret.LongArtCust = 1000
                ElseIf IdCust = 12 Then
                    Ret.IdArticle = 3
                    Ret.LibArticle = "Bureau droit + caisson juxtaposé dim:L1600 P800mm"
                    Ret.LibDim = ""
                    Ret.LibCouleur = "POIRIER"
                    Ret.LongArtCust = 0
                End If
     
                Return Ret
            Catch ex As Exception
                Return Nothing
            End Try
        End Function
     
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim LstCat = GetCustoms()
            Stop
        End Sub
     
    End Class

    J'ai mis les même class (sauf ce qui viens de la BDD) et les mêmes valeurs
    Donc la syntaxe serai bonne mais il y aurai un problème de tri sur un type de donnée, mais lequel, surtout qu'une partie du tri marche alors pourquoi pas sur la longueur?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour Yannick,

    Je vois que tu sembles avoir déjà énormément d'expérience alors je ne sais pas si je vais pouvoir t'aider efficacement...

    Cela dit, quand tu fais des requêtes Linq dans ce code c'est du Linq to SQL ou Linq to Entities je suppose?

    Dans la BDD que tu utilises derrière quel est le type BDD du champ correspondant à "LongArtCust"?

  4. #4
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut
    C'est un Int côté SQL

    Mais je viens de mettre ma requete au propre pour ne plus avoir de classe intermédiaire et optimiser en même temps le nombre de requête
    Code vb : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
     Public Class LstCustFromSoc
            Property IdCust As Integer
            Property RefClt As String
            Property IdArticle As Integer
            Property LibArticle As String
            Property LibDim As String
            Property LibCouleur As String
            Property PathCouleur As String
            Property LongArtCust As Integer?
            Property ProfArtCust As Integer?
            Property HautArtCust As Integer?
        End Class
    Public Shared Function GetCustoms(ByVal soc As Societe, ByVal LesDatas As CatalogueMobilierEntities) As List(Of LstCustFromSoc)
            Try
                'Return (From AffCusts In LesDatas.CustomAffectations _
                'Join ArtElem In LesDatas.ArticleElements On ArtElem.IdArt Equals AffCusts.Custom.IdArt _
                'Join ElemCompo In LesDatas.ComposantElements On ElemCompo.IdElem Equals ArtElem.IdElem _
                'Join CustArt In LesDatas.CustomArticles On CustArt.IdElem Equals ArtElem.IdElem And CustArt.IdCustom Equals AffCusts.IdCustom And CustArt.IdCompoGros Equals ElemCompo.IdCompoGros _
                'Order By AffCusts.Custom.Article.Libelle, AffCusts.Custom.Article.Longueur, CustArt.ComposantCouleur.Couleur.Libelle _
                'Where (AffCusts.IdSoc = soc.IdSoc And ArtElem.DefiniCouleur And ElemCompo.DefiniCouleur)
                'Select New LstCustFromSoc With {.IdCust = AffCusts.IdCustom, .RefClt = AffCusts.RefClient, .IdArticle = AffCusts.Custom.IdArt, .LibArticle = AffCusts.Custom.Article.Libelle, _
                '                                .LibDim = "", _
                '                                .LibCouleur = CustArt.ComposantCouleur.Couleur.Libelle, .PathCouleur = PATH_IMG_GROSSISTES & CustArt.ComposantGrossiste.IdGros & FOLDER_COULEUR & CustArt.ComposantCouleur.Couleur.ImgCouleur, _
                '                                .LongArtCust = AffCusts.Custom.Article.Longueur, .ProfArtCust = AffCusts.Custom.Article.Profondeur, .HautArtCust = AffCusts.Custom.Article.Hauteur}).ToList
                Dim Query = (From AffCusts In LesDatas.CustomAffectations _
                            Join ArtElem In LesDatas.ArticleElements On ArtElem.IdArt Equals AffCusts.Custom.IdArt _
                            Join ElemCompo In LesDatas.ComposantElements On ElemCompo.IdElem Equals ArtElem.IdElem _
                            Join CustArt In LesDatas.CustomArticles On CustArt.IdElem Equals ArtElem.IdElem And CustArt.IdCustom Equals AffCusts.IdCustom And CustArt.IdCompoGros Equals ElemCompo.IdCompoGros _
                            Where AffCusts.IdSoc = soc.IdSoc And ArtElem.DefiniCouleur And ElemCompo.DefiniCouleur _
                            Select AffCusts, CustArt)
                Return (From Ret In Query.ToList Order By Ret.AffCusts.Custom.Article.Libelle, Ret.AffCusts.Custom.Article.Longueur, Ret.CustArt.ComposantCouleur.Couleur.Libelle _
                              Select New LstCustFromSoc With {.IdCust = Ret.AffCusts.IdCustom, .RefClt = Ret.AffCusts.RefClient, .IdArticle = Ret.AffCusts.Custom.IdArt, .LibArticle = Ret.AffCusts.Custom.Article.Libelle, _
                                                            .LibDim = Helper.GetStrDimension(Ret.AffCusts.Custom.Article.Longueur, Ret.AffCusts.Custom.Article.Profondeur, Ret.AffCusts.Custom.Article.Hauteur), _
                                                            .LibCouleur = Ret.CustArt.ComposantCouleur.Couleur.Libelle, .PathCouleur = PATH_IMG_GROSSISTES & Ret.CustArt.ComposantGrossiste.IdGros & FOLDER_COULEUR & Ret.CustArt.ComposantCouleur.Couleur.ImgCouleur, _
                                                            .LongArtCust = Ret.AffCusts.Custom.Article.Longueur, .ProfArtCust = Ret.AffCusts.Custom.Article.Profondeur, .HautArtCust = Ret.AffCusts.Custom.Article.Hauteur}).ToList
            Catch ex As Exception
                Return Nothing
            End Try
        End Function

    Mais j'ai le même problème, refus de trier sur LongArtCust

    Mettre Descending ou Ascending ne change rien, j'ai toujours les longueur à 1200 en en premier, après les longueur à 1000

  5. #5
    Invité
    Invité(e)
    Par défaut
    Normalement, quand tu as fais "Query.ToList", ça passe en Linq to Object. Et en Linq to Object, il n'y a pas de soucis normalement.

    Le tri dont tu me parles est bien un tri secondaire? Cela veut dire que c'est le premier tri sur lequel il n'y a pas d'égalité. Ton tri primaire c'est une chaîne de caractère. Il faut qu'elles soient parfaitement identiques (avec respect de la casse et des whitespaces) pour que le tri secondaire se fasse correctement.

    Quelles sont les valeurs renvoyées par la requête triée à la fin?

  6. #6
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut
    Je suis une buse intercidérale.

    Un espace s'est glissé entre 2 mots. Je ne l'avais pas vu.
    J'avais controlé à la fin mais pas au milieu. Dans SQLServer j'ai trouvé louche que les mots avaient les Majuscules au même endroits ... mais une chaîne semblait plus longue que l'autre

    Merci

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

Discussions similaires

  1. Code qui marche à moitié (copie d'une feuille à une autre)
    Par thierryakaguy dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 22/07/2009, 16h58
  2. [Dev OS] Troncatures qui marchent pas
    Par Neolander dans le forum C
    Réponses: 0
    Dernier message: 16/05/2009, 11h02
  3. [MySQL] Requête qui fonctionne à moitié
    Par TomDelonge dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 12/03/2009, 16h24
  4. [SmartPart] UserControl qui marche à moitié !
    Par tikris dans le forum SharePoint
    Réponses: 6
    Dernier message: 03/09/2007, 11h12
  5. Jeux qui marchent sous linux
    Par zuxion dans le forum Administration système
    Réponses: 7
    Dernier message: 04/06/2006, 18h32

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