我是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()
吗?
同样,如果是SELECT TOP 1 * FROM MyTable
,它会转换为SingleOrDefault()
吗?
我来自NHibernate世界,相应地生成查询。我不确定Dapper。当我使用MS Access时,我没有看到检查生成的查询的方法。
答案 0 :(得分:4)
不,dapper不会调整您的查询。告诉这个的直接方法很简单:方法是否返回IEnumerable...
vs IQueryable...
?如果它是第一个,那么它只能使用本地内存机制。
具体而言,默认,Query
实际上会返回完全填充的List<>
。 LINQ的Count()
方法识别该方法,并且只访问列表的.Count
属性。所以所有数据都是从数据库中提取的。
如果您想向数据库询问计数,向数据库询问计数。
至于查看实际发送到数据库的内容的机制:我们使用mini-profiler。它很棒。
注意:当您正在查询一行时:QueryFirstOrDefault
(以及您期望的其他变体)存在并在内部进行优化(包括对ADO.NET的提示,尽管并非所有提供程序都可以对这些事项采取行动)尽可能高效地完成工作,但它不会调整您的查询。在某些情况下,提供者本身(而不是精巧)可以提供帮助,但最终:如果您只想要第一行,要求数据库提供第一行(TOP
或类似的)。