Dapper.NET如何在内部使用.Count()和SingleOrDefault()?

3

虽然我之前使用过NHibernate实现了数据访问层(DAL),但我对Dapper还不熟悉,它是一个ORM框架。

查询示例:

string sql = "SELECT * FROM MyTable";
public int GetCount()
{
    var result = Connection.Query<MyTablePoco>(sql).Count();
    return result;
}

Dapper会将这个查询(内部)转换为SELECT COUNT(*) FROM MyTable,因为在结尾处使用了.Count()吗?

同样地,在使用SingleOrDefault()的情况下,它会转换为SELECT TOP 1 * FROM MyTable吗?

我来自NHibernate世界,那里它会相应地生成查询语句。但我不确定Dapper是否也是如此。由于我正在使用MS Access,我没有看到检查生成的查询语句的方法。


2
Dapper不是一个完整的ORM,它是一个微型ORM,在性能方面功能非常受限,你可以把dapper看作是一个数据映射器,它将查询结果映射到一个类上。使用dapper检索计数的正确方式应该是:var count = Connection.ExecuteScalar<long>("select count((star)) from mytable"); - Gusman
1个回答

4
不,Dapper不会调整您的查询。立即判断方法是:该方法返回 IEnumerable... 还是 IQueryable...?如果是第一个,则它只能使用本地内存机制。
具体来说,默认情况下,Query 实际上会返回一个完全填充的 List<>。LINQ 的 Count() 方法识别到这一点,只需访问列表的 .Count 属性。因此,从数据库中获取了所有数据。
如果要向数据库请求计数,请向数据库请求计数。
至于查看实际发送到数据库的机制:我们使用 mini-profiler 来完成这项工作。它非常出色。
注意:当您查询仅有一行时:QueryFirstOrDefault(以及您期望的其他变体)存在并且具有内部优化(包括对 ADO.NET 的提示,尽管并非所有提供程序都可以处理这些内容)以尽可能高效地执行操作,但它不会调整您的查询。在某些情况下,提供程序本身(而不是 Dapper)可以提供帮助,但最终:如果您只想要第一行,请向数据库请求第一行(使用 TOP 或类似的东西)。

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