查看: 163|回复: 0

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

[复制链接]

4

主题

0

回帖

0

积分

热心网友

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2011-9-17
发表于 2025-11-15 18:07:00 | 显示全部楼层 |阅读模式

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);//执行生成批插语句
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

圆梦公社,专注于为全球华人提供纯粹技术交流的地方,请勿发布任何政治及违法的言论。如有相关侵权、举报、投诉及建议等,请发 E-mail:dzh188@hotmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部