使用 Dapper ORM 检查记录是不是存在

Posted

技术标签:

【中文标题】使用 Dapper ORM 检查记录是不是存在【英文标题】:Checking if record exists using Dapper ORM使用 Dapper ORM 检查记录是否存在 【发布时间】:2016-08-17 23:35:01 【问题描述】:

我是 Dapper 的新手,所以我可能遗漏了一些明显的东西,但我不明白为什么这个查询会返回 null,即使该记录存在于表中。

queryResult = db.Query<dynamic>(@"SELECT Id FROM Customer WHERE CustomerId = @CustomerId", 
                new  CustomerId = theCustomerId ).FirstOrDefault();

我正在检查记录是否存在,在这种情况下确实存在,但 queryResult 始终为 null@CustomerId 参数是一个 string 我完全匹配..

如果我在 SQL Server 中运行 SQL 是调出记录没问题...

SELECT Id FROM Customer WHERE CustomerId = 'abc123'

其中abc123CustomerId

【问题讨论】:

【参考方案1】:

它会按照你的意愿返回 null

以下是您的查询被执行,作为Query API 的一部分

"SELECT Id FROM Customer WHERE CustomerId = @CustomerId", 
                new  CustomerId = theCustomerId 

现在当CustomerId 不匹配时会发生什么,它会产生空的IEnumerable&lt;dynamic&gt;,尽管dynamic 的原因是另一回​​事,你应该使用integer 假设Id 是一个整数

但是FirstOrDefault() 在找到一个空的IEnumerable 时会做什么,返回null,所以只需删除它就可以像Any 一样检查,默认情况下,dapper 不会返回null,你的代码正在强制它

【讨论】:

我对你的回答有点困惑。如果记录存在,我希望“FirstOrDefault”返回记录,如果不存在,则返回 null。我看不出我是如何强制返回“null” 作为一个实验,请您删除FirstorDefault() 并检查Any() 调用是否返回true,如果是,那么您是对的,如果不是,那么我是对的。想法仍然小巧玲珑,不会在其结果中强制为 null,它最多会给出一个空集合 我按照你的建议做了,当运行queryResult 现在变成false。我想我明白你在说什么。 FirstOrDefault 将返回一个空集合而不是 null。但是,如果记录存在,我会期望 queryResult 返回 true 相反,FirstOrDefault 将返回一个 Null 而不是 dapper 作为结果返回的空集合,这导致您的代码中的 Null 出现空结果 但这就是我想要的。如果没有匹配项,我想返回 null。问题是即使有匹配项,null 也会被返回。【参考方案2】:

使用dapper 检查是否存在的最佳方法是:

string sql = "SELECT count(1) FROM Customer WHERE CustomerId = @CustomerId;";

bool exists = false;

using (var connection = new SqlConnection("connection string"))

    connection.Open();
    exists = connection.ExecuteScalar<bool>(sql, new  CustomerId = "abc123" );

至于您的具体示例返回 null 的原因,我怀疑这是因为您需要在 db.Query 周围加上括号,例如:

queryResult = (db.Query<dynamic>(@"SELECT Id FROM Customer WHERE CustomerId = @CustomerId", 
            new  CustomerId = theCustomerId )).FirstOrDefault();

【讨论】:

以上是关于使用 Dapper ORM 检查记录是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

Dapper EF 等orm Mysql不支持事务解决办法

任何人都可以帮助使用 Dapper ORM 进行批量更新吗?

使用 Django ORM 进行选择性事务管理

CodeIgniter:检查记录是不是存在

SQL 检查记录是不是存在

如何使用 SQL 检查记录是不是存在?