使用 Entity Framework SqlQuery 在存储过程中传递输入参数

Pass a input parameter in Stored Procedure using Entity Framework SqlQuery

如何在MVC 的业务层的存储过程中传递输入参数。 正常的 select 查询像这样工作正常,我如何在其中传递输入参数。 例如:

public List<Customer> GetCustomer()
    {
        List<Customer> Cust = null;
        Cust = db.Database.SqlQuery<Customer>("sp_cust").ToList();
        return Cust;
    }
 SP
 create procedure sp_cust
 as
 begin
 select ID from tblCustomer WITH (NOLOCK)
 end

 Input parameter SP

 create procedure sp_cust
 @name varchar(20)
 as
 begin 
 select ID from tblCustomer WITH (NOLOCK)
 where name = @name 
 end

 I tried

 public List<Customer> GetCustomer()
    {
        List<Customer> Cust = null;
        string name = "MVC";
        Cust = db.Database.SqlQuery<Customer>("sp_cust",name).ToList();
        Cust = db.Database.SqlQuery<Customer>("sp_cust",@name).ToList();
        Cust = db.Database.SqlQuery<Customer>("sp_cust","@name").ToList();
        return Cust;
    }

为什么没用?

您使用命名参数占位符,然后将其绑定到 SqlParameter:

 mediaCat = db.Database
      .SqlQuery<Customer>("exec sp_cust @name",
         new SqlParameter("@name", name)).ToList();

但是请注意,它 isn't good practice 为 Sql 服务器中的存储过程添加前缀 sp(假设这是 RDBMS),并使用未提交的读取 (NOLOCK)可能会导致意外结果 - 如果您的数据库中存在锁定或性能相关问题,请修复索引和查询。

编辑多个参数

SqlQuery takes a params object[],所以你想传多少参数就传多少:

  .SqlQuery<Customer>("exec sp_cust @param1, @param2",
     new SqlParameter("@param1", valueForParam1),
     new SqlParameter("@param2", valueForParam2)
     ).ToList();