EFCore中巧妙利用ToQueryString()实现批插(不借助第三方包)

dotnet10发布了,ef10也快发布了,但是还是只有批量更新(ExecuteUpdateAsync)和批量删除(ExecuteDeleteAsync)功能,没有批量插入。

今天给个办法,在不引用第三方库的情况下,巧妙利用ToQueryString()实现批插。
道理很简单,就是用efcore的ToQueryString()方法返回sql字符串,然后替换拼接实现insert into(...) select ... from ...

示例:

using var ctx = new MyDbContext();
var sql = ctx.Table1
    .AsSingleQuery()//防止开启分割查询导致生成的sql不正确
    .Select(e=>new {e.Id,e.Name})//这里new的字段就是需要插入的字符,根据需要添加
    .ToQueryString();
sql=sql.Replace("SELECT", "");
sql=sql.Substring(0,sql.IndexOf("FROM",StringComparison.OrdinalIgnoreCase));
var sql1 = ctx.Table2
    .AsSingleQuery()//防止开启分割查询导致生成的sql不正确
    .Select(e=>new {e.Id,e.Name+e.Field1})//这里的new是批量插入后面的select,字段里可以有运算符
    .ToQueryString();
sql=$"INSERT INTO({sql}) {sql1}";

await ctx.Database.ExecuteSqlRawAsync(sql);//执行生成批插语句
posted @ 2025-11-15 18:07  Rick Carter  阅读(0)  评论(0)    收藏  举报