日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Entity Framework 学习高级篇1—改善EF代码的方法(上)

發布時間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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代码的方法(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。