我希望为Dapper交换一些EF代码优先的数据库请求,以加速我们网站的一些缓慢部分。我刚刚开始尝试,而且Dapper看起来很好。
我已经成功转换了一些代码以使用.Query扩展名。但现在我尝试.QueryMultiple,然后使用.Read扩展来获取每个结果集。
我试图将Dapper代码移动到一个新项目中,以使其远离我的MVC项目,而.Query的东西在那里很好。但是当我尝试使用.QueryMultiple访问一个方法时,在它甚至命中代码中的任何断点之前我都会收到错误:
Method not found: 'System.Collections.Generic.IEnumerable`1<!!0> GridReader.Read(Boolean)'.
如果我将代码移动到Web项目中,它可以正常工作。
我无法弄清楚我需要什么或者缺少什么。 Visual Studio和ReSharper看起来很开心。它正在编译。这只是一个运行时问题。这两个项目都针对.Net 4.5,两者都有对Dapper的nuget引用。 Dapper项目设置为Win C#类库。我已经查看了SqlReader.cs的源代码,它似乎没有任何我已经拥有的使用方法。我相信System.Collections.Generic是自动包含的,并且在添加引用对话框中似乎无法选择。
我觉得我错过了一些非常非常明显的东西......
以下是代码:
using (var conn = new SqlConnection(ConnectionString))
{
conn.Open();
// TODO: Add in checks
const string query = @"
SELECT * FROM FileCollections WHERE Id = @fileCollectionId
SELECT * FROM Files f WHERE FileCollection_Id = @fileCollectionId
SELECT * FROM ExternalLinks WHERE FileCollection_Id = @fileCollectionId
";
// return a GridReader
using (var result = conn.QueryMultiple(query, new {fileCollectionId}))
{
var fileCollection = result.Read<FileCollection>().Single();
var files = result.Read<File>().ToList();
fileCollection.Files = files;
var externalLinks = result.Read<ExternalLink>().ToList();
fileCollection.ExternalLinks = externalLinks;
return fileCollection;
}
}
答案 0 :(得分:7)
我遇到了完全相同的问题。我的修复是通过Nuget从Dapper 1.12.1升级到Dapper 1.13以使其正常工作。
就我而言,问题在于我在一个项目中使用Dapper 1.13而在另一个项目中使用Dapper 1.12.1。
希望这有帮助!