使用 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'
其中abc123
是CustomerId
【问题讨论】:
【参考方案1】:它会按照你的意愿返回 null
以下是您的查询被执行,作为Query
API 的一部分
"SELECT Id FROM Customer WHERE CustomerId = @CustomerId",
new CustomerId = theCustomerId
现在当CustomerId
不匹配时会发生什么,它会产生空的IEnumerable<dynamic>
,尽管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 检查记录是不是存在的主要内容,如果未能解决你的问题,请参考以下文章