使用 DbParameter 而不是带有 _context.Database.SqlQuery 的 SqlParameter 来执行存储过程
Using DbParameter instead of SqlParameter with _context.Database.SqlQuery for stored proc execution
我正在使用 Entity Framework 6.1 和 GenericRepository。要执行存储过程,我正在使用 SqlQuery 方法。目前我正在使用 SqlParameters 但作为 GenericRepository 我不想使用一些特定的 class。我尝试了多种选择,但如何在此处使用 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();
我为此做了什么-
在我的域项目(具有使用代码优先从数据库创建的上下文和实体)中,我添加了一个 class 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();
}
}
然后在我的存储库项目(具有 GenericRepository 和 UnitOfWork)中,我添加了一个新方法 -
public IEnumerable<T> GetAllFromStoredProcedure(string storedProcedureName, List<StoredProcedureParameter> parameters)
{
return _context.Database.SqlQuery<T>(storedProcedureName, StoredProcedureParameter.CreateParameters(parameters));
}
现在,当调用 Repository->GetAllFromStoredProcedure 方法(从我的应用程序项目)时,我将从 Domain->StoredProcedureParameter->CreateParameters 方法创建参数列表。这确保传递的参数类型正确,我的 GenericRepository 保持通用,我的应用程序项目也不受影响。
我正在使用 Entity Framework 6.1 和 GenericRepository。要执行存储过程,我正在使用 SqlQuery 方法。目前我正在使用 SqlParameters 但作为 GenericRepository 我不想使用一些特定的 class。我尝试了多种选择,但如何在此处使用 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();
我为此做了什么-
在我的域项目(具有使用代码优先从数据库创建的上下文和实体)中,我添加了一个 class 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();
}
}
然后在我的存储库项目(具有 GenericRepository 和 UnitOfWork)中,我添加了一个新方法 -
public IEnumerable<T> GetAllFromStoredProcedure(string storedProcedureName, List<StoredProcedureParameter> parameters)
{
return _context.Database.SqlQuery<T>(storedProcedureName, StoredProcedureParameter.CreateParameters(parameters));
}
现在,当调用 Repository->GetAllFromStoredProcedure 方法(从我的应用程序项目)时,我将从 Domain->StoredProcedureParameter->CreateParameters 方法创建参数列表。这确保传递的参数类型正确,我的 GenericRepository 保持通用,我的应用程序项目也不受影响。