web-dev-qa-db-ja.com

LINQクエリで複数のレコードを削除する最良の方法?

LINQで一度に複数のレコードを削除する最良の方法は何ですか?

24
Yogs...

Linq2Sqlでレコードを削除するには

 CustomerDataContext ctx = new CustomerDataContext( "connection string"); 
 var Customers = ctx.Customers.Where(c => c.Name == "david"); 
 
 ctx.Customers.DeleteAllOnSubmit(customers); 
 ctx.SubmitChanges(); 
29
David

単一のwhere句に基づいて多くのレコードを削除する

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

ただし、_List<ListOfBadRecords>_に存在しないレコードをデータベースから削除することもできます

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

編集:

わからない方が速いですが、これでも2番目のクエリを実行できます

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

Edit2:最初のドラフトで行ったようにcontext.SaveChanges();を忘れないでください

3

古き良きSPROC .....

SPROCをDBMLファイルにドラッグすると、データベースコンテキストクラスにリッチメソッドが生成されます。

3
Khurram Aziz

エンティティフレームワークの使用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
Asad Malik

これが私が問題を解決した方法です:

_        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;
        }
_

まず、削除するアイテムのリストを見つけることができます。

次に、関数RemoveRange(**list_of_item_to_delete**)を使用して、データベースに存在するリスト内の各インスタンスを削除できます。

MSDNによると、このメソッドはリストから一定範囲の要素を削除します。

詳細については、こちらをご覧ください https://msdn.Microsoft.com/en-us/library/y33yd2b5(v = vs.110).aspx

2
Pedro Henrique

LINQ to Entitiesの詳細は次のとおりですが、役立つ場合があります。

LINQ to Entitiesでの一括削除

2
Jagd

これは私が使用したもので、最初に削除するレコードがあるテーブルのIENumerableオブジェクトを作成し、次にRemoveRangeを使用して、最後に変更をデータベースに保存します。 Productsテーブルの1つの特定のサプライヤIDからすべての製品を削除するとします。これは、これを行う方法です。

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

1
Cesar Duran

多分この答えには遅すぎるかもしれませんが、今日私はこの要求に私自身で遭遇しました私と私はこの解決策を思いつきました

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

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

ctx.SubmitChanges();
1
Jonuz

私はKhurramに同意します。これを行うには、LINQを使用した単純なストアドプロシージャを使用する方がはるかに効率的です(SQLでこれを実行するための十分な権限がある場合)。これを例で補足します。

ストアドプロシージャ:

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

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

ストアドプロシージャをデータベースエクスプローラーからDBMLファイルのメソッドペインにドラッグします。ファイルを保存します。そしてコードでは:

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

    SETSDataContext context = new SETSDataContext();
    context.RemovePermissionsFromRole(roleID);
}
0
Brandon Ward