1. 程式人生 > >Linq to Entity-執行儲存過程

Linq to Entity-執行儲存過程

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關聯的,對它進行任何操作都會執行資料庫操作從而修改資料庫的資料。