2010-12-21 10 views
4

Ich habe eine Tabelle, die eine Reihe von Duplikaten enthält. Dies sind exakte Duplikate abzüglich der Primärschlüsselspalte, bei der es sich um eine ganzzahlige Identitätsspalte handelt.Verwenden von LINQ zum Suchen/Löschen von Duplikaten

Mit EF und LINQ, wie finde ich die Duplikate und lösche sie, so dass nur eine Kopie übrig bleibt.

Ich fand die Duplikate und eine Anzahl von jedem mit SQL und SSMS. Ich weiß nur nicht, wo ich mit LINQ anfangen soll.

Danke!

+1

Gibt es einen Grund, warum Sie Löschen Sie die Dubletten nicht einfach mit T-SQL? –

+0

@ Mike M - Ich versuche, mehr mit LINQ zu tun, und ich bin mir nicht sicher, wie man es mit T-SQL tut :-) – DenaliHardtail

Antwort

7

Aus der Spitze von meinem Kopf (nicht getestet):

var q = from r in Context.Table 
     group r by new { FieldA = r.FieldA, FieldB = r.FieldB, // ... 
      into g 
     where g.Count() > 1 
     select g; 
foreach (var g in q) 
{ 
    var dupes = g.Skip(1).ToList(); 
    foreach (var record in dupes) 
    { 
     Context.DeleteObject(record); 
    } 
} 
Context.SaveChanges(); 
+0

Die While-Schleife wird eine Endlosschleife. Warum nicht "Skip (1)" in den Dups und dann "foreach" über das Ergebnis und lösche sie so? – Enigmativity

+0

@Enigmatismus: Guter Punkt; Festsetzung. –

+0

Das ist ähnlich wie ich ursprünglich dachte, die Lösung wäre. Ich hatte nur Schwierigkeiten, alle LINQ-Teile zusammenzusetzen. Vielen Dank! – DenaliHardtail

0

Aufbauend auf @Craig Stuntz ‚s Antwort mit einer "Motto" Alternative:

var duplicates = db.Table.GroupBy(a => new { a.FieldA, a.FieldB, ...}) 
         .Where(a => a.Count() > 1) 
         .SelectMany(a => a.ToList()); 

foreach (var d in duplicates) 
{ 
    db.DeleteObject(d); 
} 

db.SaveChanges(); 
Verwandte Themen