我是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
答案 0 :(得分:1)
它返回null,因为你希望它这样做
以下是您的查询被执行,作为Query
API
"SELECT Id FROM Customer WHERE CustomerId = @CustomerId",
new { CustomerId = theCustomerId }
现在当CustomerId
不匹配时会发生什么,它会产生空的IEnumerable<dynamic>
,尽管它与dynamic
有不同的故事,你应该使用integer
假设{ {1}}是一个整数
但Id
找到空FirstOrDefault()
时会做什么,返回IEnumerable
,所以只需将其删除就像null
一样检查,默认情况下dapper不会返回Any
,您的代码强制它
答案 1 :(得分:0)
使用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();