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
或类似) .
我是 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
或类似) .