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

时间:2016-08-17 23:35:01

标签: sql-server dapper

我是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

2 个答案:

答案 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();