Linq to Sql: Cách xóa nhanh bảng


88

Để xóa tất cả các hàng trong bảng, tôi hiện đang thực hiện như sau:

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

Tuy nhiên, điều này dường như mất nhiều thời gian. Có cách nào nhanh hơn?


Có lý do gì khiến bạn không sử dụng chương trình đã lưu trữ để xóa nhanh hơn và an toàn hơn không? Bạn có thể có proc ánh xạ lên dbml
Perpetualcoder

1
Sau đó, bạn sẽ không phải làm một cho mỗi bàn? Hoặc là?
Svish

Câu trả lời:


126

Bạn có thể thực hiện lệnh cắt ngắn hoặc xóa SQL bình thường, sử dụng phương thức DataContext.ExecuteCommand :

context.ExecuteCommand("DELETE FROM Entity");

Hoặc là

context.ExecuteCommand("TRUNCATE TABLE Entity");

Quá trình xóa bạn mất nhiều thời gian vì Linq to SQL tạo câu lệnh DELETE cho mỗi thực thể , có các cách tiếp cận an toàn kiểu khác để thực hiện xóa / cập nhật hàng loạt, hãy kiểm tra các bài viết sau:


đảm bảo sửa từ "DELETE"
David

9
Tôi đã +1 điều này. Đây là tài liệu tham khảo giải thích sự khác biệt giữa Truncate (mà tôi nghĩ bạn muốn thực hiện) và Delete: mssqltips.com/tip.asp?tip=1080
David

1
+1 nhận xét của David: truncate có thể rất nhiều nhanh hơn delete
Fredrik Mork

1
@ David: Vấn đề đó là cụ thể cho khung Entity ( LINQ-to-Entities ), tôi đã sử dụng TRUNCATEtrước khi có những vấn đề về LINQ-to-SQL
Christian C. Salvadó

1
TRUNCATE sẽ xóa mọi lập chỉ mục tự động đã được thiết lập (thường là cột Id), vì vậy hãy cẩn thận nếu bạn không muốn thiết lập lại. DELETE FROM sẽ không.
JCisar

20

Thật không may, LINQ-to-SQL không thực thi các truy vấn dựa trên bộ rất tốt.

Bạn sẽ cho rằng

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

sẽ dịch sang một cái gì đó như

DELETE FROM [Entities]

nhưng tiếc là nó giống

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

Bạn sẽ thấy tương tự khi cố cập nhật hàng loạt trong LINQ-to-SQL. Bất kỳ hơn vài trăm hàng cùng một lúc và nó chỉ đơn giản là sẽ quá chậm.

Nếu bạn cần thực hiện các hoạt động hàng loạt và bạn đang sử dụng LINQ-to-SQL, bạn cần viết các thủ tục được lưu trữ.


12

Tôi thích sử dụng Phương pháp mở rộng, theo những điều sau:

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

bạn cũng có thể sử dụng cái này:

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

Câu hỏi đặt ra là: "Có cách nào nhanh hơn không?". Làm thế nào điều này sẽ nhanh hơn? Ngoài ra, đây không phải là LINQ to SQL.
Gert Arnold

-1

Mã bên dưới c # được sử dụng để Chèn / Cập nhật / Xóa / Xóa Tất cả trên bảng cơ sở dữ liệu bằng cách sử dụng LINQ to 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();                        
        }
    }
}

1
thêm một số lời giải thích
Yahya Hussein
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.