是否可以使用EF执行存储过程,使用内连接和左外连接从两个或多个表中选择数据库中的记录。
我的观点是避免在EF或LINQ中进行连接的方法,我有很多问题。
所以,如果我创建该过程,我可以使用来自用户输入的参数调用它,可以将结果分配给.ToList()
方法,然后将结果添加到asp:repeater .DataSource
。
我知道这可能是一个奇怪的问题,但我想这样做有很多原因 首先,使用EF因为我感觉更舒服。 第二,摆脱在EF中使用连接。 第三,我在某处读到,当用于经常调用查询时,使用存储过程将提高查询性能。
如果有人可以帮助我用一个例子回答这些问题,我将不胜感激。
答案 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);
}