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
或类似行 )。