我正在尝试创建一个通用的SqlDataReader扩展,可以用于每个类,而不必每次都一次又一次地创建命令。
这是我到目前为止所得到的
public static IEnumerable<TResult> Reader<TResult>(
this SqlConnection d2Connection,
string Query, Action<SqlParameterCollection> parameters,
CommandType CommandType = CommandType.Text)
到目前为止这是有效的,但是通过这种方法,我无法真正设置类属性。
我想要的是以下
public static IEnumerable<TResult> Reader<TResult>(
this SqlConnection d2Connection,
string Query, Action<SqlParameterCollection> parameters,
Func<string, string> output,
CommandType CommandType = CommandType.Text)
所以我可以这样称呼它(例子)
using (var Conn = new SqlConnection(ConnectionString))
{
var dom = Conn.Reader<User>( "SELECT ID, NAME, FIRSTNAME FROM TABLE WHERE UserID=@UserID",
p =>
{
p.AddWithValue("@UserID", UserID);
},
s =>
{
s.NAME = [Something Here];
s.FIRSTNAME = [Something Here]
}
).ToList();
}
但到目前为止,我无法让它工作,我想知道是否有人可以帮助我。
提前致谢
感谢Jakub Lortz的回答
using (var Conn = new SqlConnection(ConnectionString))
{
var dom = Conn.Reader<User>( "SELECT ID, NAME, FIRSTNAME FROM TABLE WHERE UserID=@UserID",
p =>
{
p.AddWithValue("@UserID", UserID);
},
dr =>
{
return new User()
{
NAME = dr["NAME"].ToString(),
FIRSTNAME = dr["FIRSTNAME"].ToString()
};
}
).ToList();
}
函数调用的语法似乎没问题,现在我需要实现。 到目前为止得到了这个(单人)但我需要它列表。
public static TResult Reader2<TResult>(
this SqlConnection d2Connection,
string Query, Action<SqlParameterCollection> parameters,
Func<SqlDataReader, TResult> Result,
CommandType CommandType = CommandType.Text)
{
TResult result;
using (SqlCommand d2Command = new SqlCommand(Query, d2Connection))
{
d2Command.CommandType = CommandType;
if (parameters != null)
parameters(d2Command.Parameters);
if (d2Connection.State != ConnectionState.Open)
d2Connection.Open();
using (SqlDataReader d2Reader = d2Command.ExecuteReader())
{
result = Result(d2Reader);
}
return result;
}
}
答案 0 :(得分:0)
似乎您想使用output
函数将命令的结果映射到TResult。因此,类型不应为Func<string, string>
,而应为Func<SqlDataReader, TResult>
。
现在你可以使用
using (var Conn = new SqlConnection(ConnectionString))
{
var dom = Conn.Reader<User>( "SELECT ID, NAME, FIRSTNAME FROM TABLE WHERE UserID=@UserID",
p =>
{
p.AddWithValue("@UserID", UserID);
},
dr =>
{
return new User()
{
NAME = dr["NAME"].ToString(),
FIRSTNAME = dr["FIRSTNAME"].ToString()
};
}
).ToList();
}
在Reader
方法中,遍历datareader并在每次迭代中调用output
:
var result = new List<TResult>();
while (reader.Read()) result.Add(output(reader));