如何在 Dapper 中使用一条 sql 语句传递多条记录进行更新

2024-01-08

我正在尝试使用一个 Update 语句来更新具有不同值的多个记录(我并没有尝试更新许多行以具有相同的值,这非常简单)。这就是我现在正在尝试的:

    using (var cn = GetOpenConnection()) {

        // get items where we need to set calculated fields that will now be persisted in the DB
        var items = cn.Query<MaintenanceItem>("select TOP 500 * from [Maintenance] where Tolerance IS NOT NULL");

        foreach (var mi in maintItems)
        {
            // Set calculated fields on multiple recrods
            logic.CalculateToleranceFields(mi, true);
        }


        var updateInput = items.Select(a => new {a.ToleranceMonths, a.ToleranceDays, a.ToleranceHours, a.ToleranceLandings, a.ToleranceCycles, a.ToleranceRIN }).ToList();

       // THIS DOESN'T WORK - attempting to update multiple rows with different values
       var numResults = cn.Execute(@"UPDATE rm 
                SET rm.ToleranceMonths=ur.ToleranceMonths, 
                rm.ToleranceDays=ur.ToleranceDays, 
                rm.ToleranceHours=ur.ToleranceHours, 
                rm.ToleranceLandings=ur.ToleranceLandings, 
                rm.ToleranceCycles=ur.ToleranceCycles, 
                rm.ToleranceRIN=ur.ToleranceRIN 
            from [RoutineItems] rm
            Inner Join @UpdatedRecords ur ON rm.AircraftId=ur.AircraftId AND rm.ItemNumber=ur.ItemNumber", updateInput);

        Assert.IsTrue(numResults == maintItems.Count());

    }

Dapper是否可以使用这种批量更新?我宁愿进行批量更新,而不是使用for循环将数据推入数据库。


看起来目前 Dapper 中的一项声明无法实现这一点。当考虑到需要在幕后做什么才能实现这一目标时,这是完全可以理解的。

我最终做的是使用 3 条语句创建一个临时表,填充需要更新的数据,然后通过内部联接调用临时表的更新:

cn.Execute(@"create table #routineUpdatedRecords
                        (
                            AircraftId int, 
                            ItemNumber int,
                            ToleranceMonths int,
                            ToleranceDays int,
                            ToleranceLandings int,
                            ToleranceCycles decimal(12,2),
                            ToleranceRIN decimal(12,2),
                            ToleranceHours decimal(12,2)
                        );");


cn.Execute(@"Insert INTO #routineUpdatedRecords 
    VALUES(@AircraftId, @ItemNumber, @ToleranceMonths, @ToleranceDays, 
@ToleranceLandings, @ToleranceCycles, @ToleranceRIN, @ToleranceHours)", updateInput);

var numResults = cn.Execute(@"UPDATE rm 
                                SET rm.ToleranceMonths=ur.ToleranceMonths, 
                                rm.ToleranceDays=ur.ToleranceDays, 
                                rm.ToleranceHours=ur.ToleranceHours, 
                                rm.ToleranceLandings=ur.ToleranceLandings, 
                                rm.ToleranceCycles=ur.ToleranceCycles, 
                                rm.ToleranceRIN=ur.ToleranceRIN 
                            from [RoutineItems] rm
                            Inner Join #routineUpdatedRecords ur ON rm.AircraftId=ur.AircraftId AND rm.ItemNumber=ur.ItemNumber");

我相信这比循环调用 update 更快,因为我更新了大约 600K 行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Dapper 中使用一条 sql 语句传递多条记录进行更新 的相关文章

  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names

随机推荐

  • cin >> i 输入符号 + 时出错

    在 C 程序中 我尝试处理由散布有运算符 的整数操作数组成的用户输入 我可以要求用户在每个运算符之前和之后添加空格 我的方法是假设任何不是 int 的东西都是运算符 因此 一旦流上出现非 eof 错误 我就会调用 cin clear 并将下
  • Node.js + Joi 如何显示自定义错误消息?

    在 Node js REST api 中验证用户的输入似乎非常简单Joi 但问题是我的应用程序不是用英语编写的 这意味着我需要向前端用户发送自定义的书面消息 我用谷歌搜索过这个 只发现了问题 也许有人可以为此提供解决方案 这是我用来验证的代
  • 如何在python中强制使用默认参数

    TLDR 我想将一个参数传递给一个函数 强制该函数使用它的默认值 就好像我没有提供任何参数一样 例如 def foo string DEFAULT PARAM print string def bar string None foo str
  • 如何在嵌套列表中执行条件搜索

    我有一个嵌套列表 如下所示 list c Oesophagus irregular z line as previously quad biopsies at m c Normal examination cardia mild infla
  • Django Rest-auth 注册。使用令牌认证时如何返回带有密钥的user_id

    我正在使用 Django rest auth registration 我在 urls py 中对应的条目是 url r rest auth registration include rest auth registration urls
  • 创建多屏支持应用android

    我正在 Android 中创建一个必须支持多个屏幕的应用程序 为此 我阅读了很多答案 其中我最喜欢的一个是我可以在其中创建不同的文件夹res按以下名称命名的文件夹 对于小屏幕小布局 适用于大屏幕布局大 对于超大屏幕布局 xlarge 我必须
  • 如何使用 DataContractJsonSerializer 将类类型而不是命名空间序列化为 Json 字符串

    我正在尝试使用将类层次结构序列化为 Json 字符串DataContractJsonSerializer 在 WCF 服务中 序列化派生类的默认行为是将以下键值对添加到对象 type ClassName Namespace 我的问题是命名空
  • 保存单个实体而不是整个上下文

    我遇到了一种情况 我本质上需要将一对多关联的子实体的更改写入数据库 但不保存对父实体所做的任何更改 实体框架当前处理上下文范围内的数据库提交 EntityContext SaveChanges 这对于强制执行关系等有意义 但我想知道是否有一
  • 如何检查dojo.datagrid加载完成? [复制]

    这个问题在这里已经有答案了 我的其中一个页面中有一个 dojo datagrid Datagrid 及其存储 通过调用 URL 是通过声明性方法创建的 不是通过动态 程序化 我需要执行一个 javascript 方法 该方法在我的数据网格下
  • 从两个相交的链表中查找相交的节点

    假设有两个单链表 它们在某个点相交并成为单链表 两个列表的头或起始指针已知 但相交节点未知 此外 每个列表在相交之前的节点数量是未知的 并且两个列表可能有所不同 即 List1 在到达相交点之前可能有 n 个节点 而 List2 在到达相交
  • 从 LazyLoadCollection 获取元素

    我已经发现Doctrine Common Collections Criteria如果它们对我有用的话 这是一个非常有用的概念 在 symfony 控制器中 我调用以下代码 criteria Criteria create gt where
  • 我对 SOAP 命名空间感到困惑

    我正在学习 SOAP 实现 并且对 SOAP 1 2 Envelope 的适当名称空间 URI 感到有些困惑 The SOAP 的 w3c 规范 http www w3 org TR soap12 part1指的是 http www w3
  • Ecto 查询 - 日期 + Postgres 间隔 + 查询插值

    我想创建一个 Ecto 查询来过滤 a 中的记录children按年龄排列的表格 即 最小年龄 月 gt 最大年龄 月 一种简单的方法是使用 Ectodate add特征 from c in Child where c birthday g
  • 如何仅选择 OData 子元素

    我正在构建一个 OData 应用程序 并且正在努力了解如何检索结果并且仅包含某些 子属性 首先 让我向您展示在我的构建器中的注册 builder EntitySet
  • Ng 服务抛出 @angular/core/core 没有导出成员“eeFactoryDe​​f”

    我收到了大约 50 个错误 这些错误都说 Angular core core 没有导出成员 eeFactoryDe f 它们来自不同的node modules 例如 Angular cdk ng bootstrap ngx pipes ng
  • 有没有比 Html.fromHtml() 更快的方法将 html 字符解码为字符串?

    我正在使用 Html fromHtml STRING toString 将可能包含或不包含 html 和 或 html 实体的字符串转换为纯文本字符串 这相当慢 我想我最后的计算是平均花费了大约 22 毫秒 对于大量的这些 它可以在一分钟内
  • 如何隐藏所有表单odoo中的“创建和编辑”按钮以及每行中的“搜索更多”按钮

    我想隐藏所有表单中的 创建和编辑 按钮 我还想以所有形式显示 搜索更多 按钮 目前我使用 odoo 10 让我们看看这个插件 https apps openerp com apps modules 9 0 web m2x options h
  • 如何在按下按钮后延迟删除课程?

    我的网站上有完整的页面导航 为了确保打开导航时页面无法滚动 正文采用隐藏溢出的 无滚动 类 当导航打开时 这也会删除滚动条 当再次按下导航按钮并且导航关闭时 类 no scroll 将从主体中删除 立即显示滚动条 导航栏需要 1 05 秒才
  • 使用适用于 iOS 的 Google Analytics API v3 进行会话控制?

    我刚刚用 API v3 替换了 GA 实现 并发现了这个有用的会话管理功能 https developers google com analytics devguides collection ios v3 sessions https d
  • 如何在 Dapper 中使用一条 sql 语句传递多条记录进行更新

    我正在尝试使用一个 Update 语句来更新具有不同值的多个记录 我并没有尝试更新许多行以具有相同的值 这非常简单 这就是我现在正在尝试的 using var cn GetOpenConnection get items where we