使用Entity Framework执行存储过程

8

是否可能使用EF执行存储过程,从两个或多个表中选择记录并使用内部连接和左外连接。

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

所以如果我创建了那个过程,我可以从用户输入中调用带参数的过程,可以将结果分配给.ToList()方法,然后将结果添加到asp:repeater .DataSource中。

我知道这可能是一个奇怪的问题,但我想出于很多原因做到这一点:首先,使用EF因为我感觉更舒适;其次,摆脱在EF中使用连接;第三,我在某个地方读到,使用存储过程会增强查询性能,当用于频繁调用查询时。

如果有人可以通过示例帮助我回答这些问题,我将不胜感激。


同时使用SQL Server和MySQL?EF是Code First吗? - Whencesoever
4个回答

22

你可以从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()

是的,@darren,我知道这一点。但在我这种情况下,调用此查询非常复杂,并且将在我的应用程序中经常使用,因此我更喜欢使用 SP 调用。 我的问题是如何为结果调用.ToList()方法。 - Fares Ayyad
@FaresAyyad - 我已经提供了执行存储过程的解决方案。有什么问题吗? - Darren
@DarrrenDavies,获取查询结果的类是什么? - Fares Ayyad
@FaresAyyad - 你需要创建一个表示你从存储过程中返回的列的类。我已经为你提供了一个虚拟的类,叫做 YourType - Darren
2
你知道当你忘记做简单事情的语法时,比如这样,然后不得不去谷歌搜索,然后你遇到了你的老朋友达伦... :) - DavidG

0

您可以使用ObjectContext类的ExecuteFunction方法:

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

@LeresAldtai 我没有看到 OP 说任何关于他的方法的事情。 - AminM

0

如果你正在使用Entity Framework和MySQL:

在这个例子中,我的存储过程期望一个名为myParam的参数,类型为BIGINT

var myParam = new SqlParameter("@myParam", (MySqlDbType.Int64)).Value = 100;

var res = _context.Database.SqlQuery<MyEntity>($"call MyProcedureName({pyParam})");

请注意,我正在使用C#字符串插值来构建我的查询字符串。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接