在Dapper中,QueryFirstOrDefault<T>
和ExecuteScalar<T>
的用法有什么区别?
这两个函数似乎都返回一个值,尽管QueryFirstOrDefault<T>
将返回该类型的默认值(如果未找到)。出于性能或其他原因,您是否应该始终偏爱使用两者之一,或者是否等效,而忽略返回的默认值?
答案 0 :(得分:3)
主要区别在于他们的回报:
正如其他用户所说, ExecuteScalar<T>
仅返回结果集的第一个单元格。
ExecuteScalar<T>
的返回类型是通用的<T>
,它会自动将结果强制转换为您在<T>
上指定的类型 QueryFirstOrDefault<T>
执行查询并返回您在<T>
中指定的数据类型:
如果指定的类型是基本类型(字符串,整数等),则仅返回第一列中的数据。
如果指定的类型为Object,则为结果集的每一行创建该对象的实例。请注意,假设直接使用列名===成员名映射,并且无法使用自定义映射器,因此,如果您的对象的字段名与结果集的列不同,不会获取任何值。
答案 1 :(得分:0)
Scalar期望从SQL脚本返回的只有一行; QueryFirstOrDefault不在乎返回多少行。
我认为(现在无法检查)如果返回零行,Scalar可能会抛出错误(感谢@Tim在多个结果上纠正我)。
我想说的是,偏好取决于您编写的脚本的预期功能。