Linq to Sql: So löschen Sie schnell eine Tabelle


87

Um alle Zeilen in einer Tabelle zu löschen, gehe ich derzeit wie folgt vor:

context.Entities.DeleteAllOnSubmit(context.Entities);
context.SubmitChanges();

Dies scheint jedoch ewig zu dauern. Gibt es einen schnelleren Weg?


Gibt es einen Grund, warum Sie keinen gespeicherten Prozess zum schnelleren und sichereren Löschen verwenden? Sie können den Prozess auf dbml
Perpetualcoder

1
Müssten Sie dann nicht für jeden Tisch einen machen? Oder?
Svish

Antworten:


125

Sie können einen normalen SQL-Befehl zum Abschneiden oder Löschen mit dem Befehl DataContext.ExecuteCommand ausführen Methode können :

context.ExecuteCommand("DELETE FROM Entity");

Oder

context.ExecuteCommand("TRUNCATE TABLE Entity");

Das Löschen dauert lange, da Linq to SQL für jede Entität eine DELETE-Anweisung generiert. Es gibt andere typsichere Ansätze zum / Aktualisieren von Stapeln. Überprüfen Sie die folgenden Artikel:


Stellen Sie sicher, dass Sie das Wort "LÖSCHEN"
David

9
Ich habe das getan. Hier ist eine Referenz, die den Unterschied zwischen Abschneiden (was ich denke, dass Sie tun möchten) und Löschen erklärt: mssqltips.com/tip.asp?tip=1080
David

1
+1 auf Davids Kommentar: Abschneiden kann viel schneller sein als Löschen
Fredrik Mörk

1
@ David: Dieses Problem ist spezifisch für das Entity Framework ( Linq-to-Entities ), das ich TRUNCATEzuvor ohne Probleme auf Linq-to-SQL
CMS

1
TRUNCATE löscht alle eingerichteten automatischen Indizierungen (normalerweise eine ID-Spalte). Seien Sie also vorsichtig, wenn Sie nicht möchten, dass diese zurückgesetzt werden. LÖSCHEN VON wird nicht.
JCisar

20

Leider führt LINQ-to-SQL satzbasierte Abfragen nicht sehr gut aus.

Das würden Sie annehmen

context.Entities.DeleteAllOnSubmit(context.Entities); 
context.SubmitChanges(); 

wird zu so etwas übersetzen

DELETE FROM [Entities]

aber leider ist es eher so

DELETE FROM [dbo].[Entities] WHERE ([EntitiesId] = @p0) AND ([Column1] = @p1) ...
DELETE FROM [dbo].[Entities] WHERE ([EntitiesId] = @p0) AND ([Column1] = @p1) ...
DELETE FROM [dbo].[Entities] WHERE ([EntitiesId] = @p0) AND ([Column1] = @p1) ...

Sie werden dasselbe finden, wenn Sie versuchen, ein Massenupdate in LINQ-to-SQL durchzuführen. Mehr als ein paar hundert Zeilen gleichzeitig und es wird einfach zu langsam.

Wenn Sie Stapeloperationen ausführen müssen und LINQ-to-SQL verwenden, müssen Sie gespeicherte Prozeduren schreiben.


11

Ich verwende gerne eine Erweiterungsmethode wie folgt:

public static class LinqExtension
{
  public static void Truncate<TEntity>(this Table<TEntity> table) where TEntity : class
  {
    var rowType = table.GetType().GetGenericArguments()[0];
    var tableName = table.Context.Mapping.GetTable(rowType).TableName;
    var sqlCommand = String.Format("TRUNCATE TABLE {0}", tableName);
    table.Context.ExecuteCommand(sqlCommand);
  }
}

0

Sie können dies auch verwenden:

Public void BorraFilasTabla()
{
 using(basededatos db = new basededatos())
 {
  var ListaParaBorrar = db.Tabla.Tolist();
  db.Tabla.RemoveRange(ListaParaBorrar); 
 }
}

Die Frage ist: "Gibt es einen schnelleren Weg?". Wie wäre das schneller? Dies ist auch nicht LINQ to SQL.
Gert Arnold

-1

Der folgende c # -Code wird zum Einfügen / Aktualisieren / Löschen / Löschen aller Daten in eine Datenbanktabelle mithilfe von LINQ to SQL verwendet

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace PracticeApp
{
    class PracticeApp
    {        
        public void InsertRecord(string Name, string Dept) {
            LinqToSQLDataContext LTDT = new LinqToSQLDataContext();
            LINQTOSQL0 L0 = new LINQTOSQL0 { NAME = Name, DEPARTMENT = Dept };
            LTDT.LINQTOSQL0s.InsertOnSubmit(L0);
            LTDT.SubmitChanges();
        }

        public void UpdateRecord(int ID, string Name, string Dept)
        {
            LinqToSQLDataContext LTDT = new LinqToSQLDataContext();
            LINQTOSQL0 L0 = (from item in LTDT.LINQTOSQL0s where item.ID == ID select item).FirstOrDefault();
            L0.NAME = Name;
            L0.DEPARTMENT = Dept;
            LTDT.SubmitChanges();
        }

        public void DeleteRecord(int ID)
        {
            LinqToSQLDataContext LTDT = new LinqToSQLDataContext();
            LINQTOSQL0 L0;
            if (ID != 0)
            {
                L0 = (from item in LTDT.LINQTOSQL0s where item.ID == ID select item).FirstOrDefault();
                LTDT.LINQTOSQL0s.DeleteOnSubmit(L0);
            }
            else
            {
                IEnumerable<LINQTOSQL0> Data = from item in LTDT.LINQTOSQL0s where item.ID !=0 select item;
                LTDT.LINQTOSQL0s.DeleteAllOnSubmit(Data);
            }           
            LTDT.SubmitChanges();
        }

        static void Main(string[] args) {
            Console.Write("* Enter Comma Separated Values to Insert Records\n* To Delete a Record Enter 'Delete' or To Update the Record Enter 'Update' Then Enter the Values\n* Dont Pass ID While Inserting Record.\n* To Delete All Records Pass 0 as Parameter for Delete.\n");
            var message = "Successfully Completed";
            try
            {
                PracticeApp pa = new PracticeApp();
                var enteredValue = Console.ReadLine();                
                if (Regex.Split(enteredValue, ",")[0] == "Delete") 
                {
                    Console.Write("Delete Operation in Progress...\n");
                    pa.DeleteRecord(Int32.Parse(Regex.Split(enteredValue, ",")[1]));
                }
                else if (Regex.Split(enteredValue, ",")[0] == "Update")
                {
                    Console.Write("Update Operation in Progress...\n");
                    pa.UpdateRecord(Int32.Parse(Regex.Split(enteredValue, ",")[1]), Regex.Split(enteredValue, ",")[2], Regex.Split(enteredValue, ",")[3]);
                }
                else
                {
                    Console.Write("Insert Operation in Progress...\n");
                    pa.InsertRecord(Regex.Split(enteredValue, ",")[0], Regex.Split(enteredValue, ",")[1]);
                }                                
            }
            catch (Exception ex)
            {
                message = ex.ToString();
            }
            Console.Write(message);            
            Console.ReadLine();                        
        }
    }
}

1
Fügen Sie eine Erklärung hinzu
Yahya Hussein
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.