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);//执行生成批插语句
作者:Rick Carter
出处:http://pains.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
浙公网安备 33010602011771号