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

我是Dapper的新手虽然我知道ORM和DAL并且之前已经使用NHibernate实现了DAL。

示例查询: –

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

Dapper会将此查询(内部)转换为SELECT COUNT(*) FROM MyTable查看.Count()吗?

同样,如果是SingleOrDefault() ,它会转换为SELECT TOP 1 * FROM MyTable吗?

我来自NHibernate世界,它相应地生成查询。 我不确定Dapper。 当我使用MS Access时,我没有看到检查生成的查询的方法。

不,dapper不会调整您的查询。 告诉这个的直接方法很简单:该方法是否返回IEnumerable... vs IQueryable... ? 如果它是第一个,那么它只能使用本地内存机制。

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

如果要向数据库询问计数, 请向数据库询问计数

至于查看实际发送到数据库的内容的机制:我们使用mini-profiler。 它很棒。

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