【发布时间】:2014-01-15 14:23:35
【问题描述】:
我希望用 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;
}
}
【问题讨论】:
-
我看到了同样的行为。
-
这很奇怪 - 我看看能不能复制
-
@MarcGravell 您是否设法重新创建了这个?当其他所有内容都在自己的项目中时,我不得不将这些特殊类型的查询分解为我的主项目中的帮助程序,这似乎是一种耻辱。
标签: .net asp.net-mvc c#-4.0 generics dapper