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

时间:2016-03-12 09:55:26

标签: c# dapper

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

1 个答案:

答案 0 :(得分:4)

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

具体而言,默认Query实际上会返回完全填充的List<>。 LINQ的Count()方法识别该方法,并且只访问列表的.Count属性。所以所有数据都是从数据库中提取的。

如果您想向数据库询问计数,向数据库询问计数

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

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