Entity Framework 学习高级篇1—改善EF代码的方法(上)
本節,我們將介紹一些改善EF代碼的相關方法,如NoTracking,GetObjectByKey, Include等。
l???????? MergeOption.NoTracking
當我們只需要讀取某些數據 而不需要刪除、更新的時候,可以指定使用MergeOption.NoTracking的方式來執行只讀查詢(EF默認的方式是AppendOnly)。 當指定使用NoTracking來進行只讀查詢時,與實體相關的引用實體不會被返回,它們會被自動設置為null。因此,使用NoTracking可以提 升查詢的性能。示例代碼如下:
[Test]
??????? public void NoTrackingTest()
??????? {
??????????? using (var db = new NorthwindEntities1())
??????????? {
//針對Customers查詢將使用MergeOption.NoTracking
??????????????? db.Customers.MergeOption = MergeOption.NoTracking;
??????????????? var cust = db.Customers.Where(c => c.City == "London");
??????????????? foreach (var c in cust)
??????????????????? Console.WriteLine(c.CustomerID);
?
??????????????? //也可以這樣寫
??????????????? //var cust1 = ((ObjectQuery<Customers>)cust).Execute(MergeOption.NoTracking);
?
??????????????? //Esql寫法
??????????????? //string esql = "select value c from customers as c where c.CustomerID='ALFKI'";
??????????????? //db.CreateQuery<Customers>(esql).Execute(MergeOption.NoTracking).FirstOrDefault();
?
??????????? }
??????? }
?
l???????? GetObjectByKey/First
GetObjectByKey:
在EF中,使用GetObjectByKey方法獲取數據時,它首先會查詢是否有緩存,如果有緩存則從緩存中返回需要的實體。如果沒有則查詢數據庫,返回需要的實體,并添加在緩存中以便下次使用。
First: 總從數據庫中提取需要的實體。
因此,我們應在合適的地方選擇GetObjectByKey方法來獲取數據,以減少對數據庫的訪問提升性能。示例代碼如下:
[Test]
?????? ?public void GetByKeyTest()
??????? {
??????????? using (var db = new NorthwindEntities1())
??????????? {
??????????????? //從數據庫中提取數據
??????????????? var cst = db.Customers.First(c => c.CustomerID == "ALFKI");
??????????????? Console.WriteLine(cst.CustomerID);
?
??????????????? //將從緩存中提取數據
??????????????? EntityKey key = new EntityKey("NorthwindEntities1.Customers", "CustomerID", "ALFKI");
??????????????? var cst1 = db.GetObjectByKey(key) as Customers;
??????????????? Console.WriteLine(cst1.CustomerID);
?
?
???????????}
??????? }
此外,需要注意的是如果GetObjectByKey沒有獲取到符合條件的數據,那么它會拋異常。為了避免此情況發生,在有可能出現異常的地方,我們應該使用TryGetObjectByKey方法。TryGetObjectByKey方法獲取數據的方式和GetObjectByKey類似,只是當沒有取到符合條件的數據時,TryGetObjectByKey會返回null而不是拋異常。示例代碼如下:
[Test]
??????? public void TryGetByKeyTest()
??????? {
??????????? using (var db = new NorthwindEntities1())
??????????? {
?
??????????????? //沒有符合條件的數據會有異常拋出
??????????????? EntityKey key = new EntityKey("NorthwindEntities1.Customers", "CustomerID", "♂風車車.Net");
??????????????? var cst = db.GetObjectByKey(key) as Customers;
??????????????? Console.WriteLine(cst.CustomerID);
?
??????????????? //沒有符合條件的數據會有返回null
??????????????? EntityKey key1 = new EntityKey("NorthwindEntities1.Customers", "CustomerID", "♂風車車.Net");
??????????????? Object cst1 = null;
??????????????? db.TryGetObjectByKey(key1, out cst1);
??????????????? if (cst1 != null)
??????????????????? Console.WriteLine(((Customers)cst1).CustomerID);
?
??????????? }
??????? }
?
l???????? First /FirstOrDefault
First: 當我們使用First來獲取數據,如果沒有符合條件的數據,那么我們的代碼將會拋出異常。
FirstOrDefault: 當我們使用FirstOrDefault來獲取的數據,如果沒有符合條件的數據,那么它將返回null。
顯然,對于一個良好的代碼,是對可以預見的異常進行處理,而不是等它自己拋出來。示例代碼如下:
[Test]
??????? public void FirstTest()
??????? {
??????????? using (var db = new NorthwindEntities1())
??????????? {
?
??????????????? //拋異常的代碼
??????????????? var cst = db.Customers.First(c => c.CustomerID == "♂風車車.Net");
??????????????? Console.WriteLine(cst.CustomerID);//此處將出拋異常
???????????????
??????????????? //推薦的使用如下代碼:
??????????????? var cst1 = db.Customers.FirstOrDefault(c => c.CustomerID == "♂風車車.Net");
??????????????? if (cst1 != null)
??????????????????? Console.WriteLine(cst1.CustomerID);
??????????? }
??????? }
l???????? 延遲加載/Include
EF不支持實體的部分屬性延遲加載,但它支持實體關系的延遲加載。默認情況,實體的關系是不會加載。如下代碼:
[Test]
??????? public void IncludeTest()
??????? {
???? ???????using (var db = new NorthwindEntities1())
??????????? {
?????????????? var csts = db.Customers;
??????????????? foreach (var c in csts)
??????????????? {
??????????????????? Console.WriteLine(c.CustomerID);
??????????????????? foreach (var o in c.Orders)
??????????????????????? Console.WriteLine("?? " + o.OrderID);
??????????????? }
??????????? }
??????? }
上述代碼中,因為Orders沒有被加載,所以在輸出Orders的時候,是不會有任何輸出的。
當我們需要加載某些關聯的關系時,可是用Include方法,如下代碼所示:
[Test]
??????? public void IncludeTest()
??????? {
??????????? using (var db = new NorthwindEntities1())
??????????? {
?????????????? var csts = db.Customers.Include("Orders");
??????????????? foreach (var c in csts)
??????????????? {
??????????????????? Console.WriteLine(c.CustomerID);
??????????????????? foreach (var o in c.Orders)
??????????????????????? Console.WriteLine("?? " + o.OrderID);
??????????????? }
??????????? }
??????? }
上述代碼中,Customers關聯的Orders將被加載。
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 原文鏈接:http://www.cnblogs.com/xray2005/archive/2009/06/08/1499005.html轉載于:https://www.cnblogs.com/xwj517537691/archive/2013/06/08/3126955.html
總結
以上是生活随笔為你收集整理的Entity Framework 学习高级篇1—改善EF代码的方法(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VSCODE 一键编译运行
- 下一篇: 23个硬币问题