- 创建存储过程
在数据库中创建存储过程,例如下面的例子:
CREATE PROCEDURE [dbo].[usp_GetOrderById]
@OrderId INT
AS
BEGIN
SELECT * FROM Orders WHERE OrderId = @OrderId
END
- 在EF中创建实体类
在EF中创建与存储过程查询结果相对应的实体类,例如下面的例子:
public class Order
{
public int OrderId { get; set; }
public string CustomerName { get; set; }
public DateTime Date { get; set; }
public decimal Total { get; set; }
}
- 导入存储过程
将存储过程导入到EF中,以便在EF中调用存储过程。打开模型设计器,在模型浏览器中右键单击存储过程文件夹,然后选择 “导入存储过程”,如下图:
在弹出的窗口中输入存储过程名称和返回的实体类,如下图:
- 调用存储过程
在控制器中可以像使用EF一样调用存储过程,例如下面的例子:
public class OrderController : Controller
{
private readonly MyDbContext _dbContext;
public OrderController(MyDbContext dbContext)
{
_dbContext = dbContext;
}
public ActionResult GetOrderById(int id)
{
var order = _dbContext.Database.SqlQuery<Order>(“exec usp_GetOrderById @OrderId”, new SqlParameter(“@OrderId”, id)).SingleOrDefault();
return View(order);
}
}
使用SqlQuery方法调用存储过程,传递存储过程名称和SqlParameter对象,SqlParameter对象是存储过程所需参数的集合。
- 显示结果
在视图中显示查询结果,例如下面的例子:
@model Order
@{
ViewBag.Title = “订单详情”;
}
<div>
<h2>订单编号:@Model.OrderId</h2>
<p>客户名称:@Model.CustomerName</p>
<p>订单日期:@Model.Date.ToShortDateString()</p>
<p>订单总价:@Model.Total.ToString(“c”)</p>
</div>
在视图中使用@model指令引用实体类,然后可以像使用任何其他实体类一样在视图中显示查询结果。
以下是示例代码:
- 创建存储过程
CREATE PROCEDURE GetEmployeeById
@Id INT
AS
BEGIN
SELECT * FROM Employees WHERE Id = @Id
END
- 在EF中创建一个Function Import(函数导入)来绑定存储过程
在EF模型中,右键单击空白处,选择「添加 -> 函数导入」,在「选定存储过程或函数」中选择之前创建的存储过程,并设置返回类型为 “Employees”。
- 调用存储过程
using (var context = new MyDbContext())
{
var employee = context.GetEmployeeById(1).FirstOrDefault();
Console.WriteLine("{0} {1}", employee.FirstName, employee.LastName);
}
注意,这里使用了FirstOrDefault()方法来获取单个Employee对象。
如果存储过程返回的是多个结果集或多个行集合,可以使用多个ObjectResult<T>类型来接受返回值。
using (var context = new MyDbContext())
{
var employeeInfo = context.GetEmployeeInfoById(1);
// 获取第一个结果集
var employee = employeeInfo.FirstOrDefault();
Console.WriteLine("{0} {1}", employee.FirstName, employee.LastName);
// 获取第二个结果集
var orders = employeeInfo.MoveNext() ? employeeInfo.Current.ToList() : null;
if (orders != null)
{
foreach (var order in orders)
{
Console.WriteLine("{0} {1} {2}", order.OrderId, order.OrderDate, order.TotalAmount);
}
}
}
这里的GetEmployeeInfoById是另一个例子,它返回两个结果集:
CREATE PROCEDURE GetEmployeeInfoById
@Id INT
AS
BEGIN
SELECT * FROM Employees WHERE Id = @Id
SELECT * FROM Orders WHERE EmployeeId = @Id
END
发布者:luotuoemo,转转请注明出处:https://www.jintuiyun.com/158752.html