2012-04-10 10 views
3

ich habe ein Modell, wie untenvergleichen zwei aufeinanderfolgenden Reihen - Gruppe von

ID  Date     BoitierNumber 
1  07/04/2012 14:01:46  1 
2  07/04/2012 14:01:50  2 
3  07/04/2012 14:01:50  3 
4  07/04/2012 14:01:56  1 
5  07/04/2012 14:02:06  1 
6  07/04/2012 14:02:10  2 

I Reihen von (BoitierNumber) gruppiert haben

*boitier Number 1 

1  07/04/2012 14:01:46 
4  07/04/2012 14:01:56 
5  07/04/2012 14:02:06 

*boitier Number 2 

2  07/04/2012 14:01:50 
6  07/04/2012 14:02:10 

*boitier Number 3 

3  07/04/2012 14:01:50 

das ich diesen Code

var groups = context.Essais.GroupBy(p => p.BoitierNumber) 
       .Select(g => new { GroupName = g.Key, Members = g }); 

foreach (var g in groups) 
{ 
    Console.WriteLine("Members of {0}", g.GroupName); 

    foreach (var member in g.Members.OrderBy(x=>x.Id)) 
    { 
     Console.WriteLine("{0}  {1}", member.Id,member.Date); 
    } 
} 
verwendet zu tun haben,

Für den Moment funktioniert alles gut jetzt möchte ich das Datum der beiden Sukzession gruppiert Zeilenvergleichenwenn row [i] .date> row [i-1] .date i Zeile löschen wird [i-1]

Zum Beispiel:

*boitier Number 1 

1  07/04/2012 14:01:46 
4  07/04/2012 14:01:56 
5  07/04/2012 14:02:06 
8  07/04/2012 14:01:00 
10  07/04/2012 14:00:00 
13  07/04/2012 14:03:00 
boitier Number 1 
---> Date of row of Id 4 > Date of row of ID 1 
then i will delete row of ID 1 
---> Date of row of Id 5 > Date of row of ID 4 
then i will delete row of ID 4 
---> Date of row of Id 8 < Date of row of ID 5 
then i will skip it 
---> Date of row of Id 10 < Date of row of ID 8 
then i will skip it 
---> Date of row of Id 13 > Date of row of ID 10 
then i will delete row of ID 10 
... 

TherFore, After this process, only rows 13 and 8 will be remain 
+0

Wenn Sie Löschen sagen, meinen Sie löschen aus der Datenbank? – Phil

+0

Ja, ich möchte die Zeilen aus der Datenbank löschen. –

+0

Warum nicht ein for anstelle einer foreach verwenden und das vorherige Element (i-1) überprüfen? –

Antwort

3

Der schnellste Änderung, die Sie tun können, ist jetzt:

var groups = context.Essais.GroupBy(p => p.BoitierNumber) 
       .Select(g => new 
           { 
            GroupName = g.Key, 
            Members = g.OrderBy(m=>m.Id) 
           }); 

EDIT Es EF mit Aufruf ToList() in der Projektion nicht funktionieren scheint.

Die Mitglieder wird nun eine geordnete Liste von id, dann können Sie ein tun für anstelle einer foreach

foreach (var g in groups) 
{ 
    var members = g.Members.ToList(); 
    for (int i = 1, i < members.Count; i++) 
    { 
     var previousMember = members[i-1]; 
     var currentMember = members[i]; 
     if (..) 
      // code to delete 
    } 
} 

Nur eine Notiz. Wenn die gruppierten Elemente mit der ersten Abfrage projiziert werden, werden andere Abfragen erstellt, um die Elemente auszuwählen, die den einzelnen Gruppenschlüsseln entsprechen. Sie laden immer noch die gesamte Tabelle, aber in nachfolgenden Abfragen. Sie können die Gruppierung im Speicher vornehmen:

var groups = context.Essais 
         .AsEnumberable(). 
         .GroupBy(p => p.BoitierNumber) 
         .Select(g => new { GroupName = g.Key, Members = g.OrderBy(m=>m.Id).ToList() }); 
+0

In deinem 'for' willst du die Variable' groups' verwenden? Warum starten Sie die Schleife bei 1 und nicht bei Null? –

+0

@SteveMallory, dies würde innerhalb des ersten Iterators verwendet werden. Ich fange bei 1 an, also würde es eine vorherige geben. Ich werde meine Antwort bearbeiten, vielleicht ist es nicht klar. –

+0

@AdrianIftode ich bekomme diesen Fehler 'LINQ to Entities erkennt die Methode nicht 'System.Collections.Generic.List'1 [Model.Essai] ToList [Essai] (System.Collections.Generic.IEnumerable'1 [Model.Essai ]) 'in line foreach (var g in Gruppen) –

Verwandte Themen