2010-12-15 15 views
1

zu finden Ich habe diese question für die ich eine Lösung zur Verfügung gestellt. Allerdings glaube ich nicht, dass so effizient ist, wie es sein könnte:Gibt es eine effizientere Methode, um Duple in Sql-Server

using (DataContext context = new DataContext(SqlConnection) 
{ 
    var custInfo = context.GetTable<tbl_CustomerInfo>(); 

    string compID = ImportCust.Rows[0]["CompanyID"].ToString(); 

    var imports = from cust in ImportCust.AsEnumerable() 
        select cust.Field<int>("CustomerID"); 

    var dupes = from import in imports 
       join cust in custInfo 
       on import equals cust.CustomerID 
       where cust.CompanyID== pivnum 
       select cust; 

    var records = dupes.GetEnumerator(); 

    while (records.MoveNext()) 
    { custInfo.DeleteOnSubmit(records.Current); } 

    context.SubmitChanges(); 
} 

I Stopwatch verwendet habe bei verstrichene Zeit von records bis zur Fertigstellung von SubmitChanges Spanning Iteration zu suchen. Die verstrichenen Zeiten scheinen keinen Reim oder Grund zu haben:

10666 in 20 Sekunden abgeschlossen Aufzeichnungen
15425 in 12 Sekunden abgeschlossen Aufzeichnungen
289 Datensätze in 21 Sekunden abgeschlossen

Offensichtlich eine Sache, die Dinge beschleunigen würde up ist, wenn ich Indizes fallen lassen würde. Kann das programmatisch gemacht werden? Gibt es außerdem eine bessere Methode als die, die ich zur Verfügung gestellt habe?

+2

ehrlich, der effizienteste Platz Betrogenen zu finden, ist in dem Bauch des Tieres (in der Datenbank - gespeicherte Prozedur). Ich würde mich wundern, wenn eine Anforderung auf Ihrer UI/Präsentation wäre, "Duplikate anzuzeigen". Ich denke, das ist Wartung? – RPM1984

+0

Sind beide Datensatzsätze bereits in der Datenbank gespeichert oder befinden sich die ImportCust-Datensätze nur im Speicher? – NotMe

+0

@ RPM1984: Ja, nach einer Show & erzählen Sie mit meinem Manager er schreibt einen SP für diese Last. – IAbstract

Antwort

3

könnten Sie SQL-Anweisung verwenden:

-- TSQL (SQL Server 2005/2008): -- 

select CompanyID from tbl_CustomerInfo 
    group by CompanyID 
    having COUNT(*)>1 
2

Die Linq-Version Tefod SQL:

from ci in dc.tbl_CustomerInfo 
group ci by ci.CompanyID into g 
where g.Count() > 1 
select g.Key 
+0

+1: sehr nett. Ich kann das auch in anderen Projekten verwenden. Ich habe mich gut in den Titel "Data Utilities Developer" eingefügt. – IAbstract

Verwandte Themen