使用Func<,>和SQL查询的Action扩展

时间:2015-10-06 20:38:45

标签: c# sql

我正在尝试创建一个通用的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;
    }
}

1 个答案:

答案 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));