EFCore中巧妙利用ToQueryString()实现批插(不借助第三方包)
<p>dotnet10发布了,ef10也快发布了,但是还是只有批量更新(ExecuteUpdateAsync)和批量删除(ExecuteDeleteAsync)功能,没有批量插入。</p><p>今天给个办法,在不引用第三方库的情况下,巧妙利用ToQueryString()实现批插。<br>
道理很简单,就是用efcore的ToQueryString()方法返回sql字符串,然后替换拼接实现insert into(...) select ... from ...</p>
<p>示例:</p>
<pre><code class="language-csharp">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);//执行生成批插语句
</code></pre>
</div>
<div id="MySignature" role="contentinfo">
<div id="AllanboltSignature">
<p id="PSignature" style="border-top-color: #e0e0e0; border-top-width: 1px; border-top-style: dashed; border-right-color: #e0e0e0; border-right-width: 1px; border-right-style: dashed; border-bottom-color: #e0e0e0; border-bottom-width: 1px; border-bottom-style: dashed; border-left-color: #e0e0e0; border-left-width: 1px; border-left-style: dashed; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 80px; background-image: url(https://images.cnblogs.com/cnblogs_com/pains/109838/r_copyright.png); background-attachment: initial; background-origin: initial; background-clip: initial; font-family: 微软雅黑; font-size: 11px; background-color: #e5f1f4; background-position: 1% 50%; background-repeat: no-repeat no-repeat; ">
作者:Rick Carter
<br />
出处:http://pains.cnblogs.com/
<br />
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
</p>
</div><br><br>
来源:https://www.cnblogs.com/pains/p/19208600
頁:
[1]