1.在model中创建存储过程Model,将存储过程与实体进行映射,名称为存储过程名_Result:其中的属性是存储过程的返回值
create procedure "Ten Most Expensive Products" AS
SET ROWCOUNT 10
SELECT Products.ProductName AS TenMostExpensiveProducts, Products.UnitPrice
FROM Products
ORDER BY Products.UnitPrice DESC
public partial class Ten_Most_Expensive_Products_Result
{
public string TenMostExpensiveProducts { get; set; }
public Nullable<decimal> UnitPrice { get; set; }
}
2.在DbContext子类中创建执行方法:传递存储过程名:Ten_Most_Expensive_Products
public virtual ObjectResult<Ten_Most_Expensive_Products_Result> Ten_Most_Expensive_Products()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Ten_Most_Expensive_Products_Result>("Ten_Most_Expensive_Products");
}
3.测试执行存储过程:
static void TestProc()
{
using (NorthwindEntities NWEntities = new TestLINQToEntitiesApp.NorthwindEntities())
{
IEnumerable<Ten_Most_Expensive_Products_Result> tenProducts = from p in
NWEntities.Ten_Most_Expensive_Products()
select p;
foreach (Ten_Most_Expensive_Products_Result p in tenProducts)
{
Console.WriteLine("Product Name: {0}, Price: {1}", p.TenMostExpensiveProducts, p.UnitPrice);
}
}
}
4.如果存储过程返回的实体在model中已经存在了,则可以不用新建一个model, 直接利用原来的Model, 并直接在Dbcontext子类中创建执行方法:
Create PROCEDURE [dbo].[GetProduct]
( @ProductID int ) AS
SET NOCOUNT ON
Select * from Products where ProductID = @ProductID
public virtual ObjectResult<Product> GetProduct(Nullable<int> productID)
{
var productIDParameter = productID.HasValue ?
new ObjectParameter("ProductID", productID) :
new ObjectParameter("ProductID", typeof(int));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Product>("GetProduct", productIDParameter);
}
Product getProduct = NWEntities.GetProduct(1).FirstOrDefault();
此时 由GetProduct得到的product是与Dbcontext关联的,对它进行任何操作都会执行数据库操作从而修改数据库的数据。