“ QueryFirstOrDefault <T>”和“ ExecuteScalar <T>”之间有什么区别?

时间:2019-09-10 13:35:32

标签: c# dapper

在Dapper中,QueryFirstOrDefault<T>ExecuteScalar<T>的用法有什么区别?

这两个函数似乎都返回一个值,尽管QueryFirstOrDefault<T>将返回该类型的默认值(如果未找到)。出于性能或其他原因,您是否应该始终偏爱使用两者之一,或者是否等效,而忽略返回的默认值?

2 个答案:

答案 0 :(得分:3)

主要区别在于他们的回报:

正如其他用户所说,

ExecuteScalar<T>仅返回结果集的第一个单元格

  • ExecuteScalar<T>的返回类型是通用的<T>,它会自动将结果强制转换为您在<T>上指定的类型

QueryFirstOrDefault<T>执行查询并返回您在<T>中指定的数据类型:

  • 如果指定的类型是基本类型(字符串,整数等),则仅返回第一列中的数据。

  • 如果指定的类型为Object,则为结果集的每一行创建该对象的实例。请注意,假设直接使用列名===成员名映射,并且无法使用自定义映射器,因此,如果您的对象的字段名与结果集的列不同,不会获取任何值。

答案 1 :(得分:0)

Scalar期望从SQL脚本返回的只有一行; QueryFirstOrDefault不在乎返回多少行。

我认为(现在无法检查)如果返回零行,Scalar可能会抛出错误(感谢@Tim在多个结果上纠正我)。

我想说的是,偏好取决于您编写的脚本的预期功能。