none
Somme de plusieurs champs en Linq To Object RRS feed

  • Question

  • Bonjour.

    Contexte : VB 2010.

    Soit une classe C comprenant des propriétés String (S1, S2, S3...) et des propriétés numériques (Integer ou Decimal) (N1, N2, N3...).

    Soit un objet L = List(Of C) garni de nombreux items.

    Quelle instruction SQL permet de renvoyer une seule occurrence de classe C, où chaque champ String contient le mot "Total" et chaque champ numérique contient la somme de toutes les lignes ?

    Merci d'avance,

    Gilbert

    mardi 28 juin 2011 13:15

Réponses

  • Je n'avais pas fait attention au fait que le langage cible était VB.Net. Voici le même code après passage dans convertisseur :

    Public Class Data
      Public Property s1() As String
        Get
          Return m_s1
        End Get
        Set(value As String)
          m_s1 = Value
        End Set
      End Property
      Private m_s1 As String
    
      Public Property s2() As String
        Get
          Return m_s2
        End Get
        Set(value As String)
          m_s2 = Value
        End Set
      End Property
      Private m_s2 As String
    
      Public Property i1() As Integer
        Get
          Return m_i1
        End Get
        Set(value As Integer)
          m_i1 = Value
        End Set
      End Property
      Private m_i1 As Integer
    
      Public Property i2() As Integer
        Get
          Return m_i2
        End Get
        Set(value As Integer)
          m_i2 = Value
        End Set
      End Property
      Private m_i2 As Integer
    End Class
    
    
    

    Dim list As New List(Of Data)() From {
     New Data() With {
     .i1 = 1,
     .i2 = 2
     },
     New Data() With {
     .i1 = 2,
     .i2 = 4
     }, _
     New Data() With {
     .i1 = 3,
     .i2 = 6
     }
    }
    
    Dim d As New Data() With {
     .s1 = "Total",
     .i1 = list.Select(Function(x) x.i1).Sum(),
     .s2 = "Total",
     .i2 = list.Select(Function(x) x.i2).Sum()
    }
    
    


    mercredi 29 juin 2011 08:52

Toutes les réponses

  • Bonjour,

    il est possible d'utiliser la méthode Sum() sur les propriétés désirées. Par exemple à partir d'une classe Data :

    public class Data
    {
      public string s1
      {
       get;
       set;
      }
    
      public string s2
      {
       get;
       set;
      }
    
      public int i1
      {
       get;
       set;
      }
    
      public int i2
      {
       get;
       set;
      }
    }
    


    On crée un nouvel objet Data en sélectionnant les propriétés et en effectuant la somme :

    List<Data> list = new List<Data>()
    {
     new Data(){ i1 = 1, i2 = 2 },
     new Data(){ i1 = 2, i2 = 4 },
     new Data(){ i1 = 3, i2 = 6 }
    };
    
    Data d = new Data()
    {
     s1 = "Total",
     i1 = list.Select(x => x.i1).Sum(),
     s2 = "Total",
     i2 = list.Select(x => x.i2).Sum(),
    };
    
    

    Cordialement

    mercredi 29 juin 2011 08:45
  • Je n'avais pas fait attention au fait que le langage cible était VB.Net. Voici le même code après passage dans convertisseur :

    Public Class Data
      Public Property s1() As String
        Get
          Return m_s1
        End Get
        Set(value As String)
          m_s1 = Value
        End Set
      End Property
      Private m_s1 As String
    
      Public Property s2() As String
        Get
          Return m_s2
        End Get
        Set(value As String)
          m_s2 = Value
        End Set
      End Property
      Private m_s2 As String
    
      Public Property i1() As Integer
        Get
          Return m_i1
        End Get
        Set(value As Integer)
          m_i1 = Value
        End Set
      End Property
      Private m_i1 As Integer
    
      Public Property i2() As Integer
        Get
          Return m_i2
        End Get
        Set(value As Integer)
          m_i2 = Value
        End Set
      End Property
      Private m_i2 As Integer
    End Class
    
    
    

    Dim list As New List(Of Data)() From {
     New Data() With {
     .i1 = 1,
     .i2 = 2
     },
     New Data() With {
     .i1 = 2,
     .i2 = 4
     }, _
     New Data() With {
     .i1 = 3,
     .i2 = 6
     }
    }
    
    Dim d As New Data() With {
     .s1 = "Total",
     .i1 = list.Select(Function(x) x.i1).Sum(),
     .s2 = "Total",
     .i2 = list.Select(Function(x) x.i2).Sum()
    }
    
    


    mercredi 29 juin 2011 08:52
  • Bonjour Nikho.

    Merci pour ta réponse hyperdétaillée !

    Je comprends que je dois exécuter une instruction Linq pour chaque champ. En fait, j'avais espéré pouvoir tout calculer en une seule instruction. Un peu comme en SQL natif, où l'on peut écrire par exemple :

    SELECT Sum(i1) AS SOMMEi1, Sum(i2) AS SOMMEi2, "Total" AS S1, etc.

    Bonne journée,

    Gilbert

     

     

    mercredi 29 juin 2011 13:11