这个实体框架调用实际上是两次访问数据库吗?
var result = from p in entities.people where p.id == 6 select p;
entities.DeleteObject(result);
让我感到震惊的是,也许DeleteObject会强制第一次获取结果,然后让对象使用,执行删除功能。
如果是这种情况,我该如何避免第二次旅行?如何通过单个数据库跳转在实体框架中执行逐个查询?
谢谢!
修改
我的原始示例有误导性,因为它是主键查询。我想真正的问题是,是否有一种方法可以使用可以从IQueryable中删除项目的单行程功能。例如:
var result = from p in entities.people where p.cityid == 6 select p;
foreach (var r in result)
{
entities.DeleteObject(r);
}
(请注意,查询是外键,因此可能会有多个结果。)
答案 0 :(得分:1)
直接删除:
var people = new people() { id = 6 };
entities.people.Attach(people);
entities.people.Remove(people);
entities.SaveChanges();
如果您想亲自查看,fire up a profiler。
编辑:
这将允许您使用Linq,但它不会是一次旅行。
var peopleToDelete = entities.people.Where(p => p.id == 6);
foreach (var people in peopleToDelete )
entities.people.DeleteObject(people );
entities.SaveChanges();
在EF中没有简单的方法可以做到这一点,确实是一个很大的烦恼(只要一个人不想使用直接SQL
,我个人不这样做)。其中一个海报链接到一个答案,该答案又链接到this article,其中使用ToTraceString描述了为此创建自己的函数的方法。
答案 1 :(得分:1)