在下面的代码中,我试图将一个函数传递func
给该GetData
函数。这将采用阅读器对象并将其映射到通用对象。
我希望将GetData
对象类型与将数据映射到该对象类型的函数一起传递,因此不必重复打开/关闭/释放连接。
这可能吗,或者有人有其他建议吗?
public T GetData<T>(string cmdText,Func<T> func)
{
using (SqlConnection conn = new SqlConnection(connectionStringBuilder.ConnectionString))
{
using (SqlCommand cmd = new SqlCommand(cmdText, conn))
{
SqlDataReader reader = cmd.ExecuteReader();
//return func(reader);
// WITHIN THE FUNC FUNCTION:
// while (reader.Read())
// {
// Map function to T e.g
// T.property = reader["column"];
// Return T
// }
}
}
}
您要查找的签名是这样的:
T GetData<T>(string cmdText, Func<SqlDataReader, T> func)
然后,您可以继续编写函数,如下所示:
public T GetData<T>(string cmdText, Func<SqlDataReader, T> func)
{
using (var conn = new SqlConnection(connectionStringBuilder.ConnectionString))
{
using (var cmd = new SqlCommand(cmdText, conn))
{
var reader = cmd.ExecuteReader();
return func(reader);
}
}
}
您将像这样使用它:
var result = GetData("select * from Foo", dr =>
{
while (dr.Read())
{
return new { property = dr["column"] };
}
throw new DataException();
});
现在,这是基于您说的想在问题中使用它的方式。
但是,在拆分实现时,您已经很难使用该功能了-一部分GetData
在调用代码中,一部分在调用代码中。
您最好使用以下签名:
IEnumerable<T> GetData<T>(string cmdText, Func<SqlDataReader, T> func)
现在您可以编写如下方法:
public IEnumerable<T> GetData<T>(string cmdText, Func<SqlDataReader, T> func)
{
using (var conn = new SqlConnection(connectionStringBuilder.ConnectionString))
{
using (var cmd = new SqlCommand(cmdText, conn))
{
var reader = cmd.ExecuteReader();
while (reader.Read())
{
yield return func(reader);
}
}
}
}
现在的优点是调用代码更加简单:
var results = GetData("select * from Foo", dr => new { property = dr["column"] });
这将返回查询返回的数据行数。
如果您知道您的调用代码仅返回一个值,则可以.Single()
在方法调用的末尾删除a ,以确保获得一个且只有一个结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句