Soru Bir LINQ sorgusunda birden çok kaydı silmenin en iyi yolu?


LINQ ile bir seferde birden çok kaydı kaldırmanın en iyi yolu nedir?


18
2018-05-15 18:41


Menşei


Gibi bir şey yapman gerekiyorsa DELETE FROM table WHERE ... sonra SQL kullanmayı düşünün. LINQ bu iş için en iyi araç olmayabilir. - Myster


Cevaplar:


Linq2Sql ile kayıtları silmek için

CustomerDataContext ctx = yeni CustomerDataContext ("bağlantı dizesi");
var müşteriler = ctx.Customers.Where (c => c.Name == "david");

ctx.Customers.DeleteAllOnSubmit (müşteriler);
ctx.SubmitChanges ();

23
2018-05-15 18:47



Bu en kolay yollardan biri ama en verimli olduğunu söylemem. Gerçekte gerçekleştirilen herhangi bir optimizasyon yoktur. Oluşturulan SQL, sorgunuzla eşleşen tüm nesneleri numaralandırır, daha sonra bunları silmek için el ile yineleme yapar. Bu gönderiyi gör - stackoverflow.com/questions/869209/bulk-deleting-via-linq - David
SQL'e LINQ kullanmıyorsanız bkz. stackoverflow.com/q/1781175/24267 - mhenry1384
'System.Linq.IQueryable <RajrangData.tblRelatedProduct>' türünün 'RajrangData.tblRelatedProduct' türüne dolaylı olarak dönüştürülemiyor. Açık bir dönüşüm var (bir dökümün eksik mi? - rahularyansharma
Kesinlikle birden fazla saklayamazsın Customer bir nesnede Customer referans ... belki şöyle bir şey istiyorsun: List<Customer> customers = ctx.Customers.Where(c => c.Name == "david").ToList(); - Sheridan
Düzeltildi, teşekkürler. - David


Eski eski SPROC'lar .....

SPROC'yi DBML dosyanıza sürükleyebilir ve veritabanıcontext sınıfınızda zengin bir yöntem yaratabilirsiniz.


2
2018-05-15 18:47





Aşağıdakiler, LINQ to Entities için daha fazladır, ancak yardımcı olabilir:

LINQ'da Varlıklara Toplu Silmek


2
2018-05-15 18:51





Varlık çerçevesini kullanma 6

// Database context
EntitiesContext db = new EntitiesContext(connString);
// Select all the records to be deleted
IEnumerable<entity> list = db.entity.where(x=>x.id == id).toList();
// Use Remove Range function to delete all records at once
db.entity.RemoveRange(list);
// Save changes
db.SaveChanges();

2
2018-02-17 13:22





Tek bir yere göre birçok kaydı kaldırma

context.EntityModel
            .RemoveAll(r => r.property == "propertyEntered");

Ancak, mevcut olmayan veritabanındaki kayıtları da kaldırabilirsiniz. List<ListOfBadRecords>

context.EntityModel
            .Where(w => w.propertyID == ID).ToList()
            .RemoveAll(r => !ListOfBadRecords.Any(a => a.anyID == r.propertyID ));

Düzenle:

Emin değilseniz daha hızlıdır, ancak 2. sorguyu da bununla yapabilirsiniz.

.RemoveAll(r => !ListOfBadRecords.Select(s=>s.propertyID ).Contains(w.propertyID ))

Edit2: unutma context.SaveChanges(); ilk taslakta yaptığım gibi


2
2018-04-28 17:32





belki de bu cevap için onun likidi geç geldi ama bugün kendime bu taleple karşı karşıya geldim ve ben bu çözümle geldim

CustomerDataContext ctx = new CustomerDataContext("connection string");

ctx.Customers.DeleteAllOnSubmit(ctx.Customers.Where(c => c.Name == "david"));

ctx.SubmitChanges();

1
2018-01-28 16:39



Şüphesiz, yaptığınız her şeyin beyanı olduğu zaman, bu çözümle 'ortaya çıkma' iddiasında bulunamazsınız. cust en popüler cevaptan DeleteAllOnSubmit yöntem. - Sheridan


Khurram ile aynı fikirdeyim, bunu LINQ ile basit bir saklı yordamla (bunu yapmak için SQL'de yeterli izinleriniz varsa) yapmak çok daha verimlidir. Bunu bir örnekle büyüteceğim.

Saklanan prosedür:

CREATE PROCEDURE [dbo].[RemovePermissionsFromRole] 
(
    @ROLE_ID int
)
AS
BEGIN
    SET NOCOUNT ON;

    DELETE FROM [RolePermissions] WHERE [RoleID] = @ROLE_ID;
END

Saklı yordamı veritabanı gezgini DBML dosyanızdaki yöntemler bölmesine sürükleyin. Dosya 'yı kaydet. Ve kod içinde:

if (Request.QueryString["RoleID"] != null) {
    int roleID = Convert.ToInt32(Request.QueryString["RoleID"]);

    SETSDataContext context = new SETSDataContext();
    context.RemovePermissionsFromRole(roleID);
}

0
2017-12-13 17:10





İşte problemi nasıl çözdüm:

        try
        {
            List<MaterialPartSerialNumber> list = db.MaterialPartSerialNumbers.Where(s => s.PartId == PartId && s.InventoryLocationId == NewInventoryLocationId && s.LocationId == LocationId).ToList();
            db.MaterialPartSerialNumbers.RemoveRange(list);
            db.SaveChanges();
        }
        catch(Exception ex)
        {
            string error = ex.Message;
        }

İlk olarak, silmek istediğiniz öğelerin bir listesini bulabilirsiniz.

Daha sonra işlevi kullanabilirsiniz RemoveRange(**list_of_item_to_delete**) Böylece veritabanında bulunan listedeki her örneği kaldırır.

MSDN'ye göre, yöntem, Listeden bir dizi öğeyi kaldırır.

Daha fazla bilgi için buradan kontrol edin https://msdn.microsoft.com/en-us/library/y33yd2b5(v=vs.110).aspx


0
2017-08-23 18:07



pls neden çalıştığını açıklamak sadece cevap olarak kod yazmaz - Louis-Roch Tessier


Kullandığım budur, önce kaldırılacak kayıtların bulunduğu tablonun IENumerable bir nesnesini oluşturun, sonra sadece RemoveRange'ı kullanın ve son olarak da veritabanındaki değişiklikleri kaydedin. Ürünler tablosundaki belirli bir tedarikçi kimliğinden tüm ürünleri kaldırmak istediğinizi varsayalım, bunu nasıl yapabilirsiniz.

IEnumerable ProductsToRemove = db.Products.Where (x => x.SupplierId == Supplierid); db.Products.RemoveRange (ProductsToRemove); db.SaveChanges ();


0
2018-02-22 17:43