Dapper.NET 如何在内部与 .Count() 和 SingleOrDefault() 一起工作?

How Dapper.NET works internally with .Count() and SingleOrDefault()?

我是 Dapper 的新手,但我了解 ORM 和 DAL,并且之前已经使用 NHibernate 实现了 DAL。

示例查询:-

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 时,我看不到检查生成的查询的方法。

不,dapper 不会调整您的查询。直接说明这一点的方法很简单:方法是 return IEnumerable... 还是 IQueryable...?如果是第一种,那么只能使用本地内存机制。

具体来说,默认情况下Query 实际上会 return 一个完全填充的 List<>。 LINQ 的 Count() 方法识别并仅访问列表的 .Count 属性。所以所有的数据都是从数据库中获取的。

如果要向数据库查询计数,向数据库查询计数

至于查看实际发送到数据库的内容的机制:我们为此使用迷你分析器。效果很好。

注意:当您只查询一行时:QueryFirstOrDefault(以及您期望的其他变体)存在并在内部进行了优化(包括对 ADO.NET 的提示,尽管并非所有提供商都可以采取行动在那些事情上)尽可能高效地做事,但它 不会 调整您的查询。在某些情况下,提供者本身(不是小巧的)可以提供帮助,但最终:如果您只想要第一行,向数据库询问第一行TOP 或类似) .