使用DbParameter而不是SqlParameter与_context.Database.SqlQuery进行存储的proc执行

时间:2017-02-23 14:56:43

标签: entity-framework repository sqlparameter

我正在使用Entity Framework 6.1和GenericRepository。要执行存储过程,我使用的是SqlQuery方法。目前我使用的是SqlParameters,但作为GenericRepository,我不想使用某些特定的类。我尝试了多个选项但是如何在这里使用DbParameter。我试图从dbcontext访问providerName(System.Data.SqlClient),但也不可用。任何方向都会有所帮助如果您希望我提供更多信息,请告诉我。

    public IEnumerable<T> GetAllFromStoredProcedure(string storedProcedureName, List<StoredProcedureParameter> parameters)
    {
        List<SqlParameter> sqlParameters = new List<SqlParameter>();

        foreach (StoredProcedureParameter parameter in parameters)
        {
            sqlParameters.Add(new SqlParameter(parameter.Name, parameter.Type) { Value = parameter.Value});
        }

        return _context.Database.SqlQuery<T>(storedProcedureName, sqlParameters.ToArray());
    }

呼叫为 -

    clientRepository.GetAllFromStoredProcedure("GetClients", parameters).ToList();

1 个答案:

答案 0 :(得分:0)

我为此做了什么 -

在我的Domain项目中(使用Code First From Database创建了Context和Entities),我添加了一个类StoredProcedureParameter -

public class StoredProcedureParameter
{
    public string Name { get; set; }
    public DbType Type { get; set; }
    public object Value { get; set; }

    public static object[] CreateParameters(List<StoredProcedureParameter> parameters)
    {
        List<SqlParameter> sqlParameters = new List<SqlParameter>();

        foreach (StoredProcedureParameter parameter in parameters)
        {
            sqlParameters.Add(new SqlParameter(parameter.Name, parameter.Type) { Value = parameter.Value });
        }

        return sqlParameters.ToArray();
    }
}

然后在我的Repository项目(包含GenericRepository和UnitOfWork)中,我添加了一个新方法 -

    public IEnumerable<T> GetAllFromStoredProcedure(string storedProcedureName, List<StoredProcedureParameter> parameters)
    {
        return _context.Database.SqlQuery<T>(storedProcedureName, StoredProcedureParameter.CreateParameters(parameters));
    }

现在,当调用Repository-&gt; GetAllFromStoredProcedure方法(来自我的Application项目)时,我将从Domain-&gt; StoredProcedureParameter-&gt; CreateParameters方法创建参数列表。这可以确保传递的参数类型正确,我的GenericRepository仍然是通用的,我的Application项目也不受影响。