我正在使用短小精悍的新项目并喜欢它,但我不明白为什么我的查询真的很慢.执行时间非常快,几乎是即时的,但连接保持打开的时间更长,而dapper将结果映射到我的对象我想.
这是一个瞥见的例子:

这个查询只是一个类似15个字段的SELECT,主键上有一个where,所以执行速度非常快,并且它不会返回那么多数据.我执行它的代码是:
using (var conn = GetConnection())
{
obj = conn.Get<T>(id);
}
Run Code Online (Sandbox Code Playgroud)
对象是一个非常基本的poco与字符串和Ints.那么为什么我在执行此操作时浪费了220毫秒,而查询执行本身需要3毫秒?区别在哪里?
谢谢你的帮助 !
更新
在我的 SQL 语句的选择部分中,有一个字段给我带来了问题。我只是逐一删除每个字段,然后找到导致问题的那个。
我不得不像这样将我的一个字段转换为 nvarchar:
CAST(my_field AS nvarchar(max)) as my_field
Run Code Online (Sandbox Code Playgroud)
原答案
它必须对映射做一些事情。因为如果我将它从“强类型”(这需要永远,将近 1 分钟)更改:
var products = connection.Query<Product>(sql).ToList();
Run Code Online (Sandbox Code Playgroud)
对“匿名”:
var products = connection.Query(sql).ToList();
Run Code Online (Sandbox Code Playgroud)
然后它执行得非常快(1秒)。
我直接在“SQL Server Management Studio”中尝试并执行 SQL 语句作为查询,它在不到 1 秒的时间内完成。
所以我的建议是,你使用“匿名映射”,直到精巧的家伙能够解决这个问题。
小智 6
当我尝试从视图投影到 POCO 对象时,我对 Dapper 也有类似的体验。
对我来说,问题最终是我的对象上的每个属性都没有一列,所以Convert.ChangeType()速度非常慢,我在视图中添加了一个总是返回的列NULL,并且Query<T>()调用速度显着加快。
在我的示例中,数据库有一个类型为 的索引列VARCHAR(10)。我试图通过 dapper 参数进行过滤,如下所示:
DbConnection con = ...
string filterParam = "test";
var results = con.Query("SELECT IndexColumn, Column1, ... FROM MyTable WHERE IndexColumn = @filterParam", new { filterParam });
Run Code Online (Sandbox Code Playgroud)
问题是 dapper(或者可能是 ADO.Net)将我的数据类型转换filterParam为NVARCHAR(MAX)数据类型。然后,Sql Server 转换IndexColumn为NVARCHAR,并执行全表扫描而不是索引查找。通过在比较之前转换参数来修复代码:
var results = con.Query("SELECT IndexColumn, Column1, ... FROM MyTable WHERE IndexColumn = CAST(@filterParam AS VARCHAR(10))", new { filterParam });
Run Code Online (Sandbox Code Playgroud)