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);//執行生成批插語句