#1536·Dapper

减少使用小数数据类型创建的查询数量

作者: bsstahl创建于 2020年9月10日更新于 2026年8月14日

说明: 这个问题的目的是确定我是否应该提交一个拉动请求,我认为在面对一个特定问题时,这一请求将使发展经验更好。 我对最佳做法的理解是,首先讨论一个问题,然后提交公关。 我搜索了StackExchange和这个存放处 任何可能已经做 与这个问题有关 并且找不到任何东西。 如果这个问题已经得到解决,或者我误解了什么,请告诉我。

正如我今天所理解的那样,十进制(数字)数据类型的默认行为是让Dapper使用数据将适合的最小可能的数据类型提交查询. 因此,如果值为123.45,则假定该类型没有明确规定,则在查询中以小数(3,2)提交. 这是一个非常合理的默认,但确实导致最终根据参数值向DB提交不同的查询.

这些不同的查询通常不是一个问题,但可能使对这些查询的分析更加困难,可能会造成一些非常小的性能影响,因为需要生成更多的查询计划,在需要将查询计划固定起来的罕见情况下,可能会使这项任务更加困难,因为根据数据的可变性,可能会有上百个查询.

这个问题可以通过明确给予Dapper一个与数据库中列的数据类型相匹配的数据类型来解决. 这样,查询总是使用该类型提交,无论查询执行次数和数据可变性如何,只创建1个查询. 经常这样

var参数=新的动态参数(;
参数。 添加("十进制Parameter1"),值ForParameter1, DbType. 十进制,参数Direction. 投入,5、9、2);
conn.Execute(干燥,参数);

以参数中的 " 精度 " 和 " 尺度 " 值(9,2)为前置值的5。 添加(.)方法代表参数值的"大小",可以使用此代码块来计算:

/ 从 Transact-SQL 引用的值 > 小数和数字
//https://docs.microsoft.com/en-us/sql/t-sql/data-types/十进制和-数字-transact-sql?view=sql-server-ver15 页面存档备份,存于互联网档案馆.
整数结果=5;
如果(精度 > 28)结果为17;
如果(精度 > 19)结果为13;
如果(精度 > 9)结果为9;

由此产生的语法从任何想象力来看都不可怕,但肯定可以更干净,特别是在同一个查询中存在一些十进制数据类型时. 此外,计算 " 大小 " 的上方码块中的功能也许应该封装在某个地方,这样就不必扩散了。 这对我来说是有意义的, 这个代码应该 生活在达珀项目 如果可能。

通过这个项目,我看到有一个 " DbString " 对象,它概括了使用有字符串数据类型的Dapper的一些复杂性。 跟踪 . . . . . . .

内容来源: DapperLib/Dapper