C# 如何创建动态执行任何存储过程的通用函数?
环境:C# 如何创建动态执行任何存储过程的通用函数?,c#,entity-framework,generics,C#,Entity Framework,Generics,环境: EF Core和.Net Core 3.1 我试图创建一个通用函数,它将动态运行任何存储过程,并可以返回任何内容 public U ExecuteStoredProcedure(string spName, params SqlParameter[], T someGenericType) 代码: 公共抽象类存储库:IRepository where T:class where C:DbContext,new() { 公共DbContext上下文{get;set;}=new C();
EF Core和.Net Core 3.1 我试图创建一个通用函数,它将动态运行任何存储过程,并可以返回任何内容
public U ExecuteStoredProcedure(string spName, params SqlParameter[], T someGenericType)
代码:
公共抽象类存储库:IRepository where T:class where C:DbContext,new()
{
公共DbContext上下文{get;set;}=new C();
公共存储库()
{
Context.ChangeTracker.QueryTrackingBehavior=QueryTrackingBehavior.NoTracking;
}
公共IEnumerable ExecuteStoredProcedure(字符串spName,参数SqlParameter[]参数)
{
if(parameters!=null&¶meters.Any())
{
var paramNames=新列表();
foreach(参数中的var参数)
{
变量名称=param.ParameterName;
if(param.Direction==ParameterDirection.Output)
{
名称=$“{param.ParameterName}OUT”;
}
参数名称。添加(名称);
}
var x=Context.Set().FromSqlRaw($“EXEC{spName}{String.Join(“,”,paramNames.ToArray())}”,parameters);
返回x.ToList();
}
返回Context.Set().FromSqlRaw($“EXEC{spName}”).ToList();
}
}
如果将其声明为public IEnumerable ExecuteStoredProcedure(字符串spName,参数SqlParameter[]),则调用者将使用repository.ExecuteStoredProcedure(“名称”),其中“double”部分是调用者选择返回的类型(在本例中是IEnumerable)。您需要更改函数中的代码,我无法与实体内容对话。本质上,函数名和参数之间的关系允许调用方发送类型参数。您可以进行以下更改:public U executestredprocedure(string spName,Func project,params SqlParameter[]parameters)
。然而,我不认为这是你想要的。你应该阅读并改进你的问题。你确定这样一个通用的程序是明智的吗?DbContext表示数据库,它包含所有表、查询数据和添加/更新/删除项的功能。您的数据库只包含一些特定的存储过程,例如A、B和C,每个存储过程都有其特定的参数。在正确的OO编程中,DbContext应该只发布那些存储过程,因为不支持其他过程。这样,错误将在编译时检测,而不是在运行时检测。
public abstract class Repository<C, T> : IRepository<T> where T : class where C : DbContext, new()
{
public DbContext Context { get; set; } = new C();
public Repository()
{
Context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
}
public IEnumerable<T> ExecuteStoredProcedure(string spName, params SqlParameter[] parameters)
{
if (parameters != null && parameters.Any())
{
var paramNames = new List<string>();
foreach (var param in parameters)
{
var name = param.ParameterName;
if (param.Direction == ParameterDirection.Output)
{
name = $"{param.ParameterName} OUT";
}
paramNames.Add(name);
}
var x = Context.Set<T>().FromSqlRaw($"EXEC {spName} {String.Join(",", paramNames.ToArray())}", parameters);
return x.ToList();
}
return Context.Set<T>().FromSqlRaw($"EXEC {spName}").ToList();
}
}