Linq to Sql: Bir tabloyu hızlı bir şekilde temizleme


88

Bir tablodaki tüm satırları silmek için şu anda aşağıdakileri yapıyorum:

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

Ancak, bu yaş alıyor gibi görünüyor. Daha hızlı bir yol var mı?


Daha hızlı ve daha güvenli silme için Depolanan bir proc kullanmamanızın herhangi bir nedeni var mı? Proc'un dbml ile eşleştirilmesini sağlayabilirsiniz
Perpetualcoder

1
O halde her tablo için bir tane yapman gerekmez mi? Veya?
Svish

Yanıtlar:


126

DataContext.ExecuteCommand yöntemini kullanarak normal bir SQL kesme veya silme komutu yapabilirsiniz :

context.ExecuteCommand("DELETE FROM Entity");

Veya

context.ExecuteCommand("TRUNCATE TABLE Entity");

Silme şekliniz uzun sürüyor çünkü Linq to SQL her varlık için bir DELETE ifadesi oluşturuyor , toplu silme / güncellemeleri yapmak için tür açısından güvenli başka yaklaşımlar var, aşağıdaki makaleleri kontrol edin:


"DELETE" kelimesini düzelttiğinizden emin olun
David

9
Bunu + 1'ledim. İşte Truncate (yapmak isteyeceğinizi düşündüğüm) ile Delete arasındaki farkı açıklayan bir referans: mssqltips.com/tip.asp?tip=1080
David

1
David'in yorumunda +1: kesme, silme işleminden çok daha hızlı olabilir
Fredrik Mörk

1
@David: Bu sorun Entity Framework'e ( Linq-to-Entities ) özgüdür , daha TRUNCATEönce Linq-to-SQL'de sorunsuz kullanmıştım
Christian C.Salvadó

1
TRUNCATE, kurulmuş olan herhangi bir otomatik indekslemeyi temizleyecektir (tipik olarak bir Id sütunu), bu yüzden sıfırlamak istemiyorsanız dikkatli olun. SİLİNMEZ.
JCisar

20

Ne yazık ki LINQ-to-SQL, set tabanlı sorguları çok iyi yürütmez.

Bunu varsayarsın

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

gibi bir şeye çevirecek

DELETE FROM [Entities]

ama maalesef daha çok

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

LINQ-to-SQL'de toplu güncelleme yapmaya çalıştığınızda da aynısını bulacaksınız. Bir seferde birkaç yüzden fazla satır varsa ve çok yavaş olacaktır.

Toplu işlemler yapmanız gerekiyorsa ve LINQ-to-SQL kullanıyorsanız, saklı yordamları yazmanız gerekir.


12

Aşağıdakilere göre bir Uzatma Yöntemi kullanmayı seviyorum:

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

bunu da kullanabilirsiniz:

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

Soru şu: "Daha hızlı bir yol var mı?" Bu nasıl daha hızlı olur? Ayrıca, bu LINQ to SQL değildir.
Gert Arnold

-1

Aşağıdaki c # kodu, LINQ to SQL kullanarak bir veritabanı tablosuna Ekle / Güncelle / Sil / SilAll için kullanılır

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
biraz açıklama ekleyin
Yahya Hüseyin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.