LINQまたはLINQ-to-Entitiesで特定のクエリに一致するオブジェクトの束を一括削除する方法はありますか?私が見つけることができる唯一の参照は古く、削除するすべてのオブジェクトを繰り返して手動で削除するのは愚かなようです。エンティティへのLINQでのバルク削除
答えて
質問は古いものです(EF5の前から)。 EF5を使用している人なら、EntityFramework.Extendedはこれを簡単に実行します。
EF6を使用して、削除する行のSQLクエリを実行したい人のための私は、クエリのすべてのレコードを削除する任意のデータコンテキストのDeleteAllOnSubmitメソッドを知っています。多くのオブジェクトが削除されているため、いくつかの最適化が必要です。私は確信していません。
実際には最適化が実行されていません。生成されたSQLは、クエリに一致するすべてのオブジェクトを列挙し、それらを手動で反復して削除します。確かに、反復ではなく、あなたのコードに比べて、DBに起こる、あなたはまだ不その内容を削除するだけで、結果セットを構築している - シンプル「FROMテーブルWHERE DELETE FOO = bar」の、構築さよりははるかに悪いです結果セットはなく、テーブルを1回だけカバーします。 –
は、私はそれが可能だろうか効率的わからないんだけど、あなたはこのような何かを試みることができる:
// 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();
それでも、クエリに一致するすべての要素を反復処理します。あなたのコードではなく、単にDB上で実行します。より効率的ですが、理想的なソリューションからはまだ遠いです。私はそれを行うに考えること –
唯一の他の方法は、その後、myDataContext.ExecuteCommandを行うことであろう(「DELETE ...」);.理想からも遠いですが、うまくいくでしょう。 –
は、削除を行うストアドプロシージャを書いて、LINQからそれを呼び出すことができます。セットベースの削除は全体的に高速になる可能性がありますが、レコードに多大な影響を及ぼすとロックの問題を引き起こす可能性があります。また、レコードセットをループするハイブリッドが必要になることもあります(一度に2000個、サイズはデータベース設計によりますが、あなたがセットベースのdelteを見つけるのが始まったら、それはテーブルの他の使用に影響を与えています)削除を行います。
しばらくは戻って私は、Entity Frameworkで4一部のブログシリーズ(1つのコマンドで)一括更新をやってカバー(部品1、2、3と4)を書きました。
そのシリーズの焦点は更新されましたが、間違いなく削除に関連する原則を使用できます。
ですから、このような何かを書くことができる必要があります:
var query = from c in ctx.Customers
where c.SalesPerson.Email == "..."
select c;
query.Delete();
[削除()拡張メソッドを実装するだけです。
DeleteAllOnSubmitがあるSystem.Data.LinqとのITableの一部であり、私はここで見ている回答は、LINQ to SQLのです
ホープこれは
を助け...方法についてのヒントのためのポストシリーズを参照してください。 LinqからSQLへ
これは、Entity Frameworkでは実行できません。
は、私はまだ解決策を持っていないが、私はEntity Frameworkのは、DeleteObjectのメソッドを使用してに依存している介してデータを削除する
using (var context = new DatabaseEntities())
{
// delete existing records
context.ExecuteStoreCommand("DELETE FROM YOURTABLE WHERE CustomerID = {0}", customerId);
}
を行うときにポストバックされることのすべてを語りました。このメソッドは、削除するエンティティクラスの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();
に**強調表示されません**。おかげさまで – Nuzzolilo
:私のような何かをしたい
using (var context = new DatabaseEntities())
{
// delete existing records
context.Database.ExecuteSqlCommand("DELETE FROM YOURTABLE WHERE CustomerID = @id", idParameter);
}
これはEF 5で私にとってはうまくいきましたが、パラメータとして@ p0を使用しなければなりませんでした。良いのは、生成されたSQLで型安全なparamチェックを提供するということです。つまり、EF5では、これはうまくいきます:context.Database.ExecuteSqlCommand( "DELETE FROM YOURTABLE WHERE CustomerID = @ p0"、idParameter); \ @ p1(次のパラメータなど)... –
:
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はエンティティと動作し、ほとんどの場合、オブジェクトのコレクションを意味するので、ループなしで実行します。
この例では、削除するレコードを取得し、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
RemoveRangeはEF6で導入されましたを使用してDBからレコードを削除する最速の方法であり、それはオブジェクトのリストを削除することができます。超簡単。
var origins= (from po in db.PermitOrigins where po.PermitID == thisPermit.PermitID select po).ToList();
db.PermitOrigins.RemoveRange(origins);
db.SaveChanges();
このコードスニペットは質問を解決するかもしれませんが[http://meta.stackexchange .com/questions/114762/explain-entire-code-based-answers)は本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 – DimaSan
- 1. エンティティへのLinqの削除
- 2. バルク挿入 - エンティティへのLinqの処理
- 3. asp.netのエンティティへのLinqと一般的な削除メソッド
- 4. B +ツリーでのバルク削除
- 5. エンティティへのLinqクエリ -
- 6. Phalcon ODMバルク削除
- 7. Marklogic 8:バルクで削除
- 8. エンティティへのLinq - 子エンティティのフィルタリング方法
- 9. エンティティへのLinqの名前
- 10. エンティティへのエンティティフレームワークのlinq
- 11. エンティティとビジネスロジックへのLinq
- 12. エンティティへのLinq '[A-G]%'クエリ
- 13. エンティティへのLinq Where Or節
- 14. エンティティへのEager-loading&LINQ
- 15. エンティティへのLinq - 参照EntityKey
- 16. エンティティとカスタムプロパティへのLinq
- 17. Linq toエンティティへのSQLクエリ -
- 18. エンティティへのLinqとSQL_Latin1_General_CP1_CI_AI
- 19. LINQKit:エンティティへのLINQでのExpandableQueryのネスト
- 20. バルク削除のためのSQLスクリプト
- 21. Linqからエンティティへの投影(IEnumerableへ)
- 22. Mixpanel - 古いユーザーのバルク削除
- 23. 削除データは、挿入バルク文の
- 24. エンティティへのLINQで注文複数列
- 25. LINQのエンティティに左は、私はエンティティへのLINQで次の達成したい
- 26. LINQのエンティティへのクエリは、このようなエンティティ表現にLINQでは値
- 27. 親エンティティの削除時に子エンティティが削除されない
- 28. XMLリテラル内のエンティティへのLinqは、 "無引数コンストラクタのみがエンティティへのLinqでサポートされています"
- 29. 削除エンティティ
- 30. LINQのエンティティへの動的取得
私はこれを受け入れられた答えに更新しました。 –
EF 6 'RemoveRange' http://stackoverflow.com/a/21468165/1876572 – Eldho