使用实体框架执行存储过程

时间:2016-08-21 09:58:56

标签: c# mysql sql-server entity-framework linq

是否可以使用EF执行存储过程,使用内连接和左外连接从两个或多个表中选择数据库中的记录。

我的观点是避免在EF或LINQ中进行连接的方法,我有很多问题。

所以,如果我创建该过程,我可以使用来自用户输入的参数调用它,可以将结果分配给.ToList()方法,然后将结果添加到asp:repeater .DataSource

我知道这可能是一个奇怪的问题,但我想这样做有很多原因 首先,使用EF因为我感觉更舒服。 第二,摆脱在EF中使用连接。 第三,我在某处读到,当用于经常调用查询时,使用存储过程将提高查询性能。

如果有人可以帮助我用一个例子回答这些问题,我将不胜感激。

3 个答案:

答案 0 :(得分:17)

您可以从Entity Framework数据上下文中调用SqlQuery

context.Database.SqlQuery<YourType>("exec usp_StoredProcedure").ToList()

作为示例,您需要一个类来映射查询结果:

public class YourType
{
   public string Property1 { get; set; }
   public string Property2 { get; set; }
}

您还可以为查询指定参数,如下所示:

SqlParameter parameter1 = new SqlParameter("@Parameter1", "Value");
context.Database.SqlQuery<YourType>("exec usp_StoredProcedure @Parameter1", parameter1).ToList()

答案 1 :(得分:0)

我们将看到如何在Entity Framework中执行存储过程,在MVC中我们将看到如何添加EF。

在数据库中执行以下脚本以创建存储过程。

CREATE PROCEDURE FETCHEMPLOYEES AS
BEGIN
    SELECT * FROM EMPTABLE
END

CREATE PROCEDURE FETCHEMPLOYEE(@ID INT) AS
BEGIN
  SELECT * FROM EMPTABLE WHERE ID = @ID
END



public class EmpModel
{
    EmployeeEntities empdb = new EmployeeEntities();

    public List<EMPTABLE> GetEmployees()
    {
       return empdb.FETCHEMPLOYEES().ToList();  
    }

    public EMPTABLE GetEmployee(int? id)
    {
        return empdb.FETCHEMPLOYEE(id).ToList().Single();
    }
}

public class EmployeeController : Controller
{
    Models.EmpModel mod = new Models.EmpModel();

    public ActionResult Index()
    {
        List<EMPTABLE> result = mod.GetEmployees();
        return View(result);
    }

    public ActionResult Details(int id)
    {
        EMPTABLE result = mod.GetEmployee(id);
        return View(result);
    }
}

有关更多分步详情,请参阅以下链接: http://dotnetvisio.blogspot.in/2014/01/execute-stored-procedure-using-entity.html

答案 2 :(得分:0)

您可以使用ExecuteFunction类的ObjectContext

 public virtual ObjectResult<CustomClassForStoreReturnedData> NameOfStoredProcedure(Nullable<int> tableID)
    {
        var IDParameter = tableID.HasValue ?
            new ObjectParameter("tableID", tableID) :
            new ObjectParameter("tableID", typeof(int));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<CustomClassForStoreReturnedData>("NameOfStoredProcedureInSQLDatabase", IDParameter);
    }