Linq ke Sql: Cara menghapus tabel dengan cepat

88

Untuk menghapus semua baris dalam tabel, saat ini saya melakukan hal berikut:

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

Namun, ini sepertinya memakan waktu lama. Apakah ada cara yang lebih cepat?

Svish
sumber
Adakah alasan Anda tidak menggunakan proc Tersimpan untuk penghapusan yang lebih cepat dan lebih aman? Anda dapat memiliki proc yang dipetakan ke dbml
Perpetualcoder
1
Bukankah Anda harus membuatnya untuk setiap meja? Atau?
Svish

Jawaban:

126

Anda dapat melakukan perintah pemotongan atau hapus SQL normal, menggunakan metode DataContext.ExecuteCommand :

context.ExecuteCommand("DELETE FROM Entity");

Atau

context.ExecuteCommand("TRUNCATE TABLE Entity");

Cara Anda menghapus memakan waktu lama karena Linq ke SQL menghasilkan pernyataan DELETE untuk setiap entitas , ada pendekatan tipe-aman lain untuk melakukan penghapusan / pembaruan batch, periksa artikel berikut ini:

Christian C. Salvadó
sumber
pastikan untuk memperbaiki kata "DELETE"
David
9
Saya memberi ini +1. Berikut referensi yang menjelaskan perbedaan antara Pemotongan (yang menurut saya ingin Anda lakukan), dan Hapus: mssqltips.com/tip.asp?tip=1080
David
1
Memberi +1 pada komentar David: pemotongan mungkin jauh lebih cepat daripada menghapus
Fredrik Mörk
1
@ David: Masalah itu khusus untuk Kerangka Kerja Entitas ( Linq-ke-Entitas ), saya telah menggunakan TRUNCATEsebelumnya tanpa masalah pada Linq-ke-SQL
Christian C. Salvadó
1
TRUNCATE akan menghapus semua pengindeksan otomatis yang telah ditetapkan (biasanya kolom Id) jadi berhati-hatilah jika Anda tidak ingin mengatur ulang. HAPUS DARI tidak akan.
JCisar
20

Sayangnya LINQ-to-SQL tidak mengeksekusi kueri berbasis set dengan sangat baik.

Anda akan berasumsi seperti itu

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

akan diterjemahkan menjadi sesuatu seperti

DELETE FROM [Entities]

tapi sayangnya itu lebih mirip

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) ...

Anda akan menemukan hal yang sama ketika Anda mencoba melakukan pembaruan massal di LINQ-to-SQL. Lebih dari beberapa ratus baris sekaligus dan itu akan menjadi terlalu lambat.

Jika Anda perlu melakukan operasi batch & Anda menggunakan LINQ-to-SQL, Anda perlu menulis prosedur yang tersimpan.

Kirk Broadhurst
sumber
12

Saya suka menggunakan Metode Ekstensi, seperti yang berikut ini:

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);
  }
}
Bill Roberts
sumber
0

Anda juga bisa menggunakan ini:

Public void BorraFilasTabla()
{
 using(basededatos db = new basededatos())
 {
  var ListaParaBorrar = db.Tabla.Tolist();
  db.Tabla.RemoveRange(ListaParaBorrar); 
 }
}
Gerardo Guajardo
sumber
Pertanyaannya adalah: "Apakah ada cara yang lebih cepat?". Bagaimana ini bisa lebih cepat? Juga, ini bukan LINQ ke SQL.
Gert Arnold
-1

Kode c # di bawah ini digunakan untuk Sisipkan / Perbarui / Hapus / Hapus Semua pada tabel database menggunakan LINQ ke SQL

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();                        
        }
    }
}

sumber
1
tambahkan beberapa penjelasan
Yahya Hussein