本節,我們將介紹一些改善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: 總從數據庫中提取需要的實體。