我正在研究将我们的EF6代码移植到Dapper以获得更好的性能,但遇到了一个奇怪的问题。单行查询在Dapper中所需的时间几乎是EF中的10倍。它看起来像这样:
using (IDbConnection conn = new SqlConnection("connection string"))
{
row = conn.Query<ReportView>("select * from ReportView where ID = @ID",
new {ID = id}))
.FirstOrDefault();
}
这个查询针对一个包含大约80列的视图,EF版本使用完全相同的查询和模型。作为参考,以下是EF版本:
row = context.ReportViews.Where(s => s.ID == id).FirstOrDefault();
我考虑到第一次查询可能会很慢,所以在“热身”期后进行了测量。我认为重复使用EF模型可能是一个问题,因此我创建了一个简单的POCO作为模型。但这些都无效。于是我尝试了不同的方法,并决定尝试使用SQL注入连接的SQL语句。
using (IDbConnection conn = new SqlConnection("connection string"))
{
row = conn.Query<ReportView>(string.Format("select * from ReportView where ID = '{0}'",
id)).FirstOrDefault();
}
这个查询比EF查询实际上更快。
那么这里发生了什么?为什么参数化查询要慢得多?