Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建动态执行任何存储过程的通用函数?_C#_Entity Framework_Generics - Fatal编程技术网

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();
    }

}