博客 / 詳情

返回

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);//執行生成批插語句
user avatar tashuo 頭像 13917911249 頭像 pudongping 頭像 zilliz 頭像 jianhuan 頭像 mylxsw 頭像 fedl 頭像 codingembedded 頭像 monkeynik 頭像 duokeli 頭像 software_arch 頭像 lindexi 頭像
31 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.