从昨天开始,我一直在尝试使这种方法起作用,并开始拔头发-
基本上,我有一个从数据库中检索文章的方法。下面是方法代码:
public static IEnumerable<Article> RetrieveTopTenArticles()
{
using(var dbConn = new SqlConnection(Settings.Instance.DbConnectionString))
{
const String query = "SELECT TOP 10 Title, Content FROM Article";
Func<SqlDataReader, Article> operation = reader => reader.ToArticle();
return dbConn.SqlRetrieveMultiple(query, operation);
}
}
在一个单独的“扩展”类中 -
public static IEnumerable<T> SqlRetrieveMultiple<T>(this SqlConnection sqlConnection, String query, Func<SqlDataReader, T> operation, params SqlParameter[] parameters)
{
sqlConnection.Open();
using (var command = new SqlCommand(query, sqlConnection))
{
if (parameters.Length > 0)
{
command.Parameters.AddRange(parameters);
}
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
yield return operation.Invoke(reader);
}
}
}
}
如您所见,我有一个扩展方法,它执行 SQL 选择语句,并迭代结果,调用操作并将每个 SqlDataReader 行转换为我的文章类型(也使用扩展方法完成)。我相信我过去使用过这种完全相同的扩展方法,没有任何问题。
当我调试它并到达 dbConn.SqlRetrieveMultiple(query, operation); 行,如果我按 F11 进入,它会完全跨过该行。它继续沿着结束嵌套括号链走,最终我在 sqlConnection.Open() 上得到一个异常。
我得到的例外是:
ConnectionString 属性尚未初始化。
我发现如果我删除我的 Func 委托,该功能将正常运行。我觉得这必须是一些愚蠢的/与扩展方法或 SqlConnection 无关的东西,因为如果我将它放在同一个类中的常规私有静态方法中,我会得到相同的行为。如果我在 sqlConnection.Open(); 处打开 .NET 框架源单步执行;行,它跳转到 .NET 框架的 ctor 方法……如果需要,我可以发布更多代码,但我认为我已经拥有了一切必要的东西。如果您有任何想法,请告诉我。