LINQまたはLINQ-to-Entitiesの特定のクエリに一致するオブジェクトの束を一括削除する方法はありますか?私が見つけることができる唯一の参照は古く、削除したいすべてのオブジェクトを繰り返して手動で削除するのはばかげているようです。
LINQまたはLINQ-to-Entitiesの特定のクエリに一致するオブジェクトの束を一括削除する方法はありますか?私が見つけることができる唯一の参照は古く、削除したいすべてのオブジェクトを繰り返して手動で削除するのはばかげているようです。
回答:
質問は古いものです(EF5が存在する前から)。EF5を使用している人なら誰でも、EntityFramework.Extendedはこれを簡単に実行します。
しばらく前に、Entity Frameworkでの一括更新(1つのコマンド)をカバーする4部構成のブログシリーズ(第1部、第2部、第3部、および第4部)を作成しました。
そのシリーズの焦点は更新でしたが、削除を行うために関連する原則を確実に使用できます。
したがって、次のようなものを書くことができるはずです。
var query = from c in ctx.Customers
where c.SalesPerson.Email == "..."
select c;
query.Delete();
あなたがする必要があるのはDelete()拡張メソッドを実装することです。方法のヒントについては、投稿シリーズを参照してください...
お役に立てれば
using (var context = new DatabaseEntities())
{
// delete existing records
context.ExecuteStoreCommand("DELETE FROM YOURTABLE WHERE CustomerID = {0}", customerId);
}
EF6を使用していて、削除のために行SQLクエリを実行したい場合:
using (var context = new DatabaseEntities())
{
// delete existing records
context.Database.ExecuteSqlCommand("DELETE FROM YOURTABLE WHERE CustomerID = @id", idParameter);
}
RemoveRangeはEF6で導入され、オブジェクトのリストを削除できます。超簡単。
var origins= (from po in db.PermitOrigins where po.PermitID == thisPermit.PermitID select po).ToList();
db.PermitOrigins.RemoveRange(origins);
db.SaveChanges();
クエリ内のすべてのレコードを削除するデータコンテキストのDeleteAllOnSubmitメソッドを知っています。多くのオブジェクトが削除されているため、基礎となる最適化が必要です。でもわかりません。
それがどれほど効率的かはわかりませんが、次のようなことを試すことができます。
// deletes all "People" with the name "Joe"
var mypeople = from p in myDataContext.People
where p.Name == "Joe";
select p;
myDataContext.People.DeleteAllOnSubmit(mypeople);
myDataContext.SubmitChanges();
Entity Frameworkを介したデータの削除は、DeleteObjectメソッドの使用に依存しています。このメソッドは、削除するエンティティクラスのEntityCollectionまたは派生ObjectContextで呼び出すことができます。簡単な例を次に示します。
NorthwindEntities db = new NorthwindEntities();
IEnumerable<Order_Detail> ods = from o in db.Order_Details
where o.OrderID == 12345
select o;
foreach (Order_Detail od in ods)
db.Order_Details.DeleteObject(od);
db.SaveChanges();
この例では、削除するレコードを取得し、それらを1つずつ結果セットに添付してから、削除するように要求します。次に、1つの保存変更があります。
using (BillingDB db = new BillingDB())
{
var recordsToDelete = (from i in db.sales_order_item
where i.sales_order_id == shoppingCartId
select i).ToList<sales_order_item>();
if(recordsToDelete.Count > 0)
{
foreach (var deleteSalesOrderItem in recordsToDelete)
{
db.sales_order_item.Attach(deleteSalesOrderItem);
db.sales_order_item.Remove(deleteSalesOrderItem);
}
db.SaveChanges();
}
}
context.Entity.Where(p => p.col== id)
.ToList().ForEach(p => db.Entity.DeleteObject(p));
これらは、EFを使用してDBからレコードを削除するための最速の方法です
私は次のようなことをします:
var recordsToDelete = (from c in db.Candidates_T where c.MyField == null select c).ToList<Candidates_T>();
if(recordsToDelete.Count > 0)
{
foreach(var record in recordsToDelete)
{
db.Candidate_T.DeleteObject(record);
db.SaveChanges();
}
}
Entity Frameworkはエンティティで動作するため、ループなしでそれを行う方法はないと思います。ほとんどの場合、これらはオブジェクトのコレクションを意味します。