Linq to Entity-執行儲存過程
阿新 • • 發佈:2019-02-04
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
2.在DbContext子類中建立執行方法:傳遞儲存過程名:Ten_Most_Expensive_Productspublic partial class Ten_Most_Expensive_Products_Result { public string TenMostExpensiveProducts { get; set; } public Nullable<decimal> UnitPrice { get; set; } }
3.測試執行儲存過程: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"); }
4.如果儲存過程返回的實體在model中已經存在了,則可以不用新建一個model, 直接利用原來的Model, 並直接在Dbcontext子類中建立執行方法: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); } } }
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關聯的,對它進行任何操作都會執行資料庫操作從而修改資料庫的資料。