2010-09-24 6 views
2

J'ai un problème en essayant de trouver une requête LINQ pour ce qui suit.Groupement conditionnel LINQ

Les colonnes sont MeterSerialNumber, Date de, DeviceType (M ou C), puis 48 colonnes de valeurs de lecture.

Certains compteurs seront équipés d'un correcteur. Pour ces compteurs, il y aura à la fois une ligne M (DeviceType) et une ligne C pour la même date. J'ai juste besoin des rangées C pour ces mètres.

par exemple.

je besoin d'une requête pour convertir ceci:

MeterSerialNumber,Date,DeviceType,Reading1,Reading2,etc 
8017680S,19/08/2010,M,12,23,etc 
4504761S,19/08/2010,M,12,23,etc 
4504761S,19/08/2010,C,12,23,etc 
08000963,19/08/2010,M,12,23,etc 

à ceci:

MeterSerialNumber,Date,DeviceType,Reading1,Reading2,etc 
8017680S,19/08/2010,M,12,23,etc 
4504761S,19/08/2010,C,12,23,etc 
08000963,19/08/2010,M,12,23,etc 

Je pense que je pourrais avoir besoin des requêtes imbriquées, mais ne peux pas obtenir ma tête autour d'elle!

+0

avez-vous cela comme des structures de données ou est-ce juste un fichier texte CSV? –

+0

Salut Isak, je l'ai dans les objets avec des noms de champs comme ci-dessus – Dene

Répondre

1

Ou essayez ceci:

var group = meters 
    .Where(m => m.DeviceType == "M" && !meters.Any(m2 => m2.MeterSerialNumber == m.MeterSerialNumber && m2.DeviceType == "C")) 
    .Union(meters 
     .Where(m => m.DeviceType == "C" && meters.Any(m2 => m2.MeterSerialNumber == m.MeterSerialNumber && m2.DeviceType == "M"))); 
+0

Merci beaucoup pour cela. Il passe les tests parfaitement! Maintenant, pour comprendre comment cela fonctionne ... – Dene

+0

vous êtes les bienvenus :) – danijels

+0

J'ai effectivement dû ajouter un autre chèque pour la date. Mais je comprends maintenant. Encore une fois - merci beaucoup – Dene

1
var query = sourceData.GroupBy(
       x => new { x.MeterSerialNumber, x.Date }, 
       (k, g) => g.OrderBy(x => x.DeviceType == 'C' ? 0 : 1).First());