2009-04-06 40 views
1

Je suis coincé avec un groupe LINQ par la situation en essayant de le résoudre sans utiliser la déclaration foreach, voici le escenary:Opérations sur LINQ Lambda Groupement

J'ai deux collections génériques List<OrderHeader> et List<OrderDetail>, les deux ont un même domaine TOTRGVS qui contient le montant total d'une commande, et le numéro de commande est la clé nommée NDORGV.

Alors je veux trouver « les commandes qui ont pas le même TOTRGVS dans OrderHeader et OrderDetail », donc j'ai essayé la requête suivante:

List<RGVCAFAC_ERRORES> diff = (from d in lstOrderDetail 
           join c in lstOrderHeader on d.NDORGV equals c.NDORGV              
           group d by d.NDORGV into g 
           let difTOTOrderDetail = g.Select(p => p.TOTRGVS).Sum() 
           let difTOTOrderHeader = g.Key.???? 
           let diffTOT = difTOTOrderHeader - difTOTOrderDetail 
           where diffTOT != 0 
           select new _ERRORS 
           { 
            NDORGV = g.Key, 
            IMPORT = diffTOT 
           } 
).ToList(); 

dans difTOTOrderHeader Je ne sais pas comment récupérer le champ TOTRGVS à partir de OrderHeader. J'ai essayé d'employer la clef mais ne peux obtenir aucun champ, juste des prolongements pour des méthodes de formatage.

+0

Si vous pensez que il est difficile de réaliser ce but sans utiliser une boucle foreach, considérez combien plus il sera difficile de debug. Allez-y et utilisez une boucle si cela vous facilite la tâche. –

Répondre

2

Cela pourrait faire l'affaire:

var dictDetails = lstOrderDetail 
    .GroupBy(d => d.NDORGV) 
    .ToDictionary(g => g.Key, g => g.Sum(d => d.TOTRGVS)); 

var result = lstOrderHeader 
    .Where(h => dictDetails[h.NDORGV] != h.TOTRGVS) 
    .ToList(); 
1

La fonction Except est normalement utilisée pour déterminer les différences dans les listes.

+0

Exceptions dans l'en-tête ou dans les détails? quand il existe déjà un groupe par X et X détermine les "objets sélectionnés", aussi j'oublie dire que Détail peut avoir plus d'une ligne c'est la raison pour laquelle j'utilise la somme du groupe! –