【问题标题】:Entity Framework with optional parameters?具有可选参数的实体框架?
【发布时间】:2013-06-20 18:00:34
【问题描述】:

使用 Entity Framework 5 是否可以使用带有可选参数的存储过程,这样您就不必为每个未使用的参数添加 null?

我必须使用的存储过程有 87 个参数,其中只有 2 个是必需的。我真的很讨厌在每次调用中都必须放置 85 个空值。

【问题讨论】:

    标签: c# sql entity-framework entity-framework-5


    【解决方案1】:

    您可以使用ObjectContext.ExecuteFunction 方法(DbContextObjectContext 的包装)来执行一些存储过程并传递参数列表:

    FooEntities db = new FooEntities();
    var objectContext = ((IObjectContextAdapter)db).ObjectContext;
    // create all parameters you need
    var name = new ObjectParameter("Name", "Lazy");
    var age = new ObjectParameter("Age", 29);
    
    // call stored procedure with these two parameters only
    var result = objectContext.ExecuteFunction<Result>("ProcedureName", name, age);
    

    您可以将此代码包装到您的 DbContext 的扩展方法中:

    public static Result ProcedureName(this FooEntities db, name, age)
    {
        // code above
    }
    

    用法如下:var result = db.ProcedureName("Lazy", 29);

    【讨论】:

    • 如果有人检查此问题并使用 EF6 或更高版本,您可以使用 dbContext.Database.SqlQuery 来完成。如果您有可选参数,则可以将值设置为 DbNull.Value。您可以创建用于构建 SqlParameters,当值为 null 时,它会设置 DbNull.Value。我希望它有所帮助。
    • @FranciscoGoldenstein 谢谢!时间流逝,一切都变了)我会在问题中添加带有适当 EF 版本的标签
    【解决方案2】:

    我正在展示@Francisco Goldenstein 对答案的评论。 “EXEC SP_MySP @One、@Two、@Three、@Four”语句中的顺序应与您的存储过程的参数相匹配。 paraOne、paraTwo 等的顺序无关紧要。

             public List<MySPEntity> GetMyData(int thirdValue, string firstValue)
            {
                    var paraOne = new SqlParameter("@One", firstValue);
                    var paraTwo = new SqlParameter("@Two", DBNull.Value);
                    var paraThree = new SqlParameter("@Three", thirdValue);
                    var paraFour = new SqlParameter("@Four", DBNull.Value);
    
                    var result = DataContext.Database.SqlQuery<MySPEntity>("EXEC SP_MySP @One, @Two, @Three, @Four"
                    , paraTwo, paraOne, paraFour,paraThree).ToList();
    
                    return result;
              
            }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      相关资源
      最近更新 更多