如何使用EFCore快速执行大型SQL查询



以下是我最近在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模型对此类操作进行编码,并具有直接编写查询的性能?

EF Core 7引入了新的方法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();
}

最新更新