在Entity Framework中使用泛型


注:本博文是"一步一步學習Entity Framework 4.x”的續篇,只講了一個概念:如何在EF中使用泛型以簡化工作.為保證延續性,本博文繼續使用前幾講的數據庫作為案例,不清楚結構的請回查前面博文的相關內容.

使用EF來進行數據查詢的確很方便,但是代碼寫得多了以后你會發現很多工作都是重復性很強的工作,比如查詢數據並返回列表.如果是小型項目,實體類在5個以內,使用常規的查詢方法尚可忍受,但是實體類多了,老是重復同一方法,很快你就會發瘋----這不但很麻煩,也沒有必要!

怎么辦呢,使用泛型是解決這一問題的重要途徑,通過研究,ObjectContext的CreateObjectSet方法就是解決這一問題的良方.

在MSDN里查閱到關於ObjectContext.CreateObjectSet 方法的相關描述是這樣的:

公共方法
CreateObjectSet<TEntity>()
創建新的 ObjectSet<TEntity> 實例,該實例用於查詢、添加、修改和刪除指定實體類型的對象。

公共方法
CreateObjectSet<TEntity>(String)
創建新的 ObjectSet<TEntity> 實例,該實例用於查詢、添加、修改和刪除具有指定類型和指定實體集名稱的對象。

從方法的說明來看,這是一個全能的方法,GURD樣樣精通,下面就使用它來實現泛型的數據查詢方法.

 

public static List<T> GetListOf<T>(Expression<Func<T, bool>> expression) where T:class
      {
          ProductsEntities _context = new ProductsEntities();          
          return _context.CreateObjectSet<T>().Where(expression).ToList();        
      }

OK,就這么兩行代碼,解決了所有使用Lambda表達式進行查詢的問題,查詢結果返回值為任意的實體類型.

參數類型Expression<Func<T,bool>>專用於Where條件篩選的表達式,在調用的時候可以直接編寫Lambda表達式,由於通過CreateObjectSet<T>方法獲取了ObjectSet對象的實例,因此可以任意對該對象進行操作,另外經過測試驚喜的發現,返回的對象自動包含了所有相關類,不再需要使用Include方法再進行包含操作了(這並不奇怪,這是因為沒有將_context變量的作用域進行限定,在對象調用完畢以后沒有立即釋放,實際上這樣做還是有一定的性能損耗的,但是作為泛型版本的示例還真就必須這么做,要不然在調用代碼里怎樣使用Include方法,因為ToList擴展方法並沒有Include擴展方法,鏈式語法在此不能使用).見如下示例:

在Presenter文件夾中新建一個類:GenericSearchDemo.cs.並在類中添加一個方法以顯示查詢結果,本次查詢仍然采用前面介紹的關於進行數據導航的例子,全部相關代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProductEFDemo.Business;
using ProductEFDemo.Models;

namespace ProductEFDemo.Presenter
{
 public static  class GenericSearchDemo
    {
     public static void ShowProductDeatil()
     {
         var products = GenricData.GetListOf<Product>(c => (c.ProductBasePrice <= 50 && c.ProductBasePrice >= 49));
         foreach (var product in products)
         {
             Console.WriteLine(String.Format("產品名稱:{0};產品大類:{1};產品小類:{2};單位:{3};基本價格:{4};",
                 product.ProductName, product.ProductSmallType.ProductBigType.ProductBigTypeName,
                 product.ProductSmallType.ProductSmallTypeName, product.ProductUnit.ProductUnitName, product.ProductBasePrice));

            
         }
     }
    }
}

調用以后,輸出的效果還是一樣的:

image

除了查詢以外,還可以進行添加,修改和刪除,操作方法也很簡單,比如添加指定對象數據,就可以這樣:

 

public static void AddNewData<T>(T t) where T : class
      {
          using (var ctx = new ProductsEntities())
          {
              ctx.CreateObjectSet<T>().AddObject(t);
              ctx.SaveChanges();
          }
      }
到時修改我們構建一個對象類型與T一樣然后傳入函數作為參數就大功告成!

 

從上面的示例來看,可以說使用泛型版本的處理函數用於EF可以大大節約開發時間和代碼數量,從而起到事半功倍的效果.美中不足的是泛型的引入又增加了解析的負擔,性能上略有損失,但這是值得的!

 

聲明:本文系本人原創,版權歸屬作者和博客園共同所有,任何組織或個人不得隨意轉載,修改。需要轉載請與本人聯系:qouoww@163.com。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM