LINQで一度に複数のレコードを削除する最良の方法は何ですか?
Linq2Sqlでレコードを削除するには
CustomerDataContext ctx = new CustomerDataContext( "connection string"); var Customers = ctx.Customers.Where(c => c.Name == "david"); ctx.Customers.DeleteAllOnSubmit(customers); ctx.SubmitChanges();
単一の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();
を忘れないでください
古き良きSPROC .....
SPROCをDBMLファイルにドラッグすると、データベースコンテキストクラスにリッチメソッドが生成されます。
エンティティフレームワークの使用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();
これが私が問題を解決した方法です:
_ 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
LINQ to Entitiesの詳細は次のとおりですが、役立つ場合があります。
これは私が使用したもので、最初に削除するレコードがあるテーブルのIENumerableオブジェクトを作成し、次にRemoveRangeを使用して、最後に変更をデータベースに保存します。 Productsテーブルの1つの特定のサプライヤIDからすべての製品を削除するとします。これは、これを行う方法です。
IEnumerable ProductsToRemove = db.Products.Where(x => x.SupplierId == Supplierid); db.Products.RemoveRange(ProductsToRemove); db.SaveChanges();
多分この答えには遅すぎるかもしれませんが、今日私はこの要求に私自身で遭遇しました私と私はこの解決策を思いつきました
CustomerDataContext ctx = new CustomerDataContext("connection string");
ctx.Customers.DeleteAllOnSubmit(ctx.Customers.Where(c => c.Name == "david"));
ctx.SubmitChanges();
私は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);
}