如何使用 dapper 获取第一个子值(通常查询 count(*) 作为唯一结果)

Posted

技术标签:

【中文标题】如何使用 dapper 获取第一个子值(通常查询 count(*) 作为唯一结果)【英文标题】:How to get the first child value using dapper (typically querying count(*) as the only result) 【发布时间】:2016-03-21 06:02:32 【问题描述】:

我想实现一些这样的功能:

public static string GetResult(string sql) 
    // TODO: 
    // result = connection.Query(....);
    // return result.FirstRow().FirstChild().ToString();

然后这样调用:

string myName = GetResult("SELECT userName from tb_Users WHERE ID = 1");
// or
int totalRows = Convert.ToInt32(GetResult("SELECT count(*) FROM tb_List"));

如何使用 Dapper 实现 TODO 部分?

【问题讨论】:

这完全取决于你告诉Dapper对象类型是什么。 First() 会给你第一行。如果你告诉Dapper 对象类型是string,你应该可以简单地返回Query<string>(sql).First();。另外 - 在结果上运行 ToString() 然后将其解析回键入的值是自找麻烦。 @Rob 帮了我很多忙! 【参考方案1】:

Dapper 有ExecuteScalar[<T>],如果您正在阅读一列、一行、一个网格,可以使用它。所以:

var name = connection.ExecuteScalar<string>("select 'abc'");
int count = connection.ExecuteScalar<int>("select 123");

还有QueryFirst|Single[OrDefault][&lt;T&gt;] 用于所有常见的“单行多列排序”场景。

请注意您的 API: 接受 sql 字符串(且没有单独的参数)的任何内容都让我非常担心您将导致 sql 注入问题。

【讨论】:

感谢您的谨慎,我上面的代码只是为了让您易于阅读的示例:P

以上是关于如何使用 dapper 获取第一个子值(通常查询 count(*) 作为唯一结果)的主要内容,如果未能解决你的问题,请参考以下文章

创建多个连接查询 - Dapper

dapper C#的Iconvertible问题

Dapper多表查询时子表字段为空

DB2 - 使用带有字符串数组参数的 Dapper 选择查询将不会返回正确的结果

Dapper系列 作者:懒懒的程序员一枚

将 Dapper MultiMapper 与外部连接查询一起使用