Dapper中是否有ExecuteScalar方法?

32

8
我们从未添加过这个方法的原因很简单:.Single() 执行相同的操作。我们调查了底层实现等相关细节,发现没有在添加额外方法方面获得真正的好处。 - Marc Gravell
.Single()在Dapper中不作为扩展方法出现,这是在.NET框架的基础方法中吗? - sgtz
2
我是指:int value = conn.Query<int>(sql, args).Single();string value = conn.Query<string>(sql, args).Single(); 等。 - Marc Gravell
请注意,您链接的附件在核心中从未存在过。 - Sam Saffron
@Sam Saffron:非常感谢。一开始我是从C#接口的角度来看待它的,然后再去适应旧代码。Marc提供的使用LINQ的.Single()方法的答案更加优雅。这样一个简单的改动使得框架变得更加简单。顺便说一下:我刚刚用Dapper替换了一些自己编写的命令对象。我们没有sql“command”缓存,而是依靠缓存的反射属性来为参数提供支持,并通过StringBuilder将它们推入到标记化的sql块中。虽然它能够正常工作,但Dapper更加简洁易用,感觉更加稳定。感谢Stack Overflow。 - sgtz
@Sam Saffron:...另外,我没有意识到这从未是核心的一部分。当我发布问题时,我正在熟悉开源项目。 - sgtz
3个回答

24

我有点困惑,如果我理解正确,在当前版本的Dapper(截至2015年10月8日的1.42版)中没有execute scalar。该功能是通过LINQ方法Single()实现的,对吗? - Sudhanshu Mishra
3
1.42仍然有它。它使用底层的SqlCommand.ExecuteScalar(),与.Single()和.First()具有不同的行为(特别是,如果没有记录返回,它将返回null)。请参阅https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar(v=vs.110).aspx。 - Evan M

12

我能够使用版本1.42.0调用ExecuteScalar<T>

    public Boolean BeforeToday(DateTime dateInQuestion)
    {
        try
        {
            using (var conn = new SqlConnection(ConnectionString))
            {
                String sql = @"SELECT CONVERT(bit, CASE WHEN getdate() > @dateParameter THEN 1 ELSE 0 END) AS BeforeToday";

                var result = conn.ExecuteScalar<Boolean>(sql, new { dateParameter = dateInQuestion });

                return result;
            }
        }
        catch (Exception)
        {
            return dateInQuestion < DateTime.Now;
        }
    }

4
在版本1.50.4中,我能够调用connection.QuerySingle<int>(query,params)

1
conn.ExecuteScalar<T> 一样吗? - Kiquenet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接