EF Core 7引入了新的方法
以下是我最近在SQL数据库上运行的SQL查询的两个简化示例:
insert into new_entity
select top 10000 field1,
field2
from old_entity
&
update top 1000 e
set field1 = 13
from entity e
where field1 is null
他们的处决速度如此之快,几乎不引人注意。
然而,如果我想使用EF执行相同的操作,我知道的方法是在每个对象上迭代:
using(var db = new myDbContext())
{
var new_objs = db.old_entity.Take(10000).Select(ot=> new new_entity() { ... });
db.new_entity.AddRange(new_objs);
db.SaveChanges();
}
&
using(var db = new myDbContext())
{
var objs = db.entity.Where(e => e.field1 == null).Take(1000);
objs.ForEach(e => e.field1 = 13);
db.SaveChanges();
}
持续了几个小时,这是不可接受的。
我可以在应用程序中执行原始SQL查询,但对于现实生活中的复杂对象来说,这是一件乏味的事。
有没有一种方法可以使用EF模型对此类操作进行编码,并具有直接编写查询的性能?
ExecuteUpdate
。您的更新查询可以用以下方式编写:
using(var db = new myDbContext())
{
var objs = db.entity.Where(e => e.field1 == null).Take(1000);
objs.ExecuteUpdate(b => b.SetProperty(x => x.field1, x => 13));
}
EF Core的任何版本都不支持INSERT FROM。
无论如何,您可以安装第三方扩展linq2db.EntityFrameworkCore,请注意,我是创建者之一。
插入
using(var db = new myDbContext())
{
var new_objs = db.old_entity.Take(10000).Select(ot=> new new_entity() { ... });
new_objs.Insert(db.new_entity.ToLinqToDBTable());
}
更新
using(var db = new myDbContext())
{
var objs = db.entity.Where(e => e.field1 == null).Take(1000);
objs
.Set(x => x.field1, x => 13)
.Update();
}