LINQ 또는 LINQ-to-Entities에서 지정된 쿼리와 일치하는 여러 개체를 대량으로 삭제할 수있는 방법이 있습니까? 내가 찾을 수있는 유일한 참조는 구식이며 제거하려는 모든 개체를 반복하고 수동으로 삭제하는 것은 어리석은 것 같습니다.
답변:
질문은 오래된 것입니다 (EF5가 존재하기 전). EF5를 사용하는 모든 사람을 위해 EntityFramework.Extended 는이 작업을 순식간에 수행합니다.
얼마 전에 Entity Framework에서 대량 업데이트 (하나의 명령 사용)를 다루는 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 개의 저장 변경 사항이 있습니다.
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는 엔터티와 함께 작동하고 대부분의 경우 개체 컬렉션을 의미하므로 루프없이 수행 할 수있는 방법이 없다고 생각합니다.