Load
延遲加載:當實體第一次讀取時,相關數據沒有加載;當第一次試圖訪問導航屬性時,所需的導航數據自動加載,EF默認使用這種方式加載數據,儘可能使用預先加載和顯示加載。sql
優勢:加載數據快數據庫
缺點:數據庫交互屢次緩存
預先加載:當讀取實體時,相關數據同時讀取。這一般會致使一個鏈接查詢,查詢全部所需的數據,使用Include方法指定預先加載。服務器
優勢: 數據庫交互少框架
缺點:加載實體多,數據量大時,變慢,會有不少冗餘字段性能
顯示加載:這種加載方式相似於延遲加載,不一樣的是咱們要在代碼中明確地查詢相關數據,導航屬性是手動控制的,須要調用Collection.Load
方法獲取集合,調用Reference.Load
方法獲取單個實體來加載相關數據。優化
優勢: 加載數據快,導航屬性如何加載能夠本身控制,一般關聯實體集合的數量被限制時,使用Load
方法翻譯
缺點: 須要本身控制,數據庫交互屢次,交互次數由本身控制設計
CompiledQuery
:提供對查詢的編譯和緩存以供從新使用。當相同的查詢須要執行不少遍的時候,那麼咱們可使用ComplieQuery
將查詢的語句進行編譯以便下次使用,這樣能夠免去對同一語句的屢次處理,從而改善性能code
優勢:減小查詢表達式樹編譯次數
AsNoTracking
:若是數據是隻讀操做,用AsNoTracking取消追蹤,提高性能。
SqlQuery
:對於複雜的查詢或存儲過程的使用,考慮用SqlQuery操做原生sql。
Skip
:分頁在數據庫中分頁,不要再內存中分頁,以提高性能
IQueryable
和IEnumerable
:IQueryable
返回的是查詢表達式,也就是說生成了SQL查詢語句可是卻尚未與數據庫進行交互。IEnumerable
則是已經執行查詢數據庫的操做且數據保存在了內存中,因此在進行條件拼接的時候必定要在IQueryable
類型後面追加Where
條件語句,而不是等到ToList
以後再開始寫條件,以提高性能。
Get
Find()
方法:查找一個實體,不只查詢數據庫,並且還查詢新添加的沒有保存到數據庫中的對象。
查找方式:內存查找->新添加還沒保存到數據庫中的對象->數據庫中還沒加載到內存中實體
優勢:根據主鍵查找,主鍵有索引,速度快
缺點:只能根據主鍵查找
GetObjectByKey()
方法:查找一個實體
查找方式:內存查找- >數據庫中實體
優勢:先從內存中取速度快
TryGetObjectByKey()
方法:查找一個實體
查找方式:內存查找- >數據庫中實體
優勢:先從內存中取速度快 , 查詢不到返回null
缺點:只能根據主鍵查找
Single()
方法:查找一個實體
查找方式:數據庫中實體
優勢:不根據主鍵進行查詢或查詢時加載相關實體
缺點:查詢沒有返回結果或返回的結果多於一個就會拋出異常
SingleOrDefault()
方法:查找一個實體
查找方式:數據庫中實體
優勢:不根據主鍵進行查詢或查詢時加載相關實體, 查詢沒有返回結果返回null
缺點:返回的結果多於一個就會拋出異常
First()
方法:查找一個實體,不關心是否有多個結果,僅僅取得第一條
查找方式:數據庫中實體
優勢:不根據主鍵進行查詢或查詢時加載相關實體, 只取第一條
缺點:查詢沒有結果就會拋出異常
FirstOrDefault()
方法:查找一個實體,不關心是否有多個結果,僅僅取得第一條
查找方式:數據庫中實體
優勢:不根據主鍵進行查詢或查詢時加載相關實體, 只取第一條,查詢沒有結果返回null
缺點:不知道是否有多條數據
事物的簡短性:儘可能把查詢語句和影響事物的語句放在事物外面執行,防止資源死鎖。
批量修改:儘可能用sql
執行
預生成視圖:在實體框架能夠針對概念模型執行查詢或將更改保存到數據源以前,它必須生成一組本地查詢視圖才能訪問數據庫。 因爲生成這些視圖會產生很高的成本,所以,您能夠在設計時預生成視圖並將它們添加到項目。預生成視圖方式參考:
https://msdn.microsoft.com/zh-cn/library/bb896240.aspx
AsEnumerable()
和ToList()
:二者都是延遲執行sql
,區別是AsEnumerable()
在執行過濾以前,先將全部數據放到內存中,再進行篩選;ToList()
則是先拼接成sql
再請求數據庫,而後結果放入內存,是真正的篩選數據。
IQueryable
和IEnumberable
:IQueryable
實現了IEnumberable
接口,IEnumerable<T>
泛型類在調用本身的SKip
和 Take
等擴展方法以前數據就已經加載在本地內存裏了,IEnumerable
跑的是Linq to Object
,強制從數據庫中讀取全部數據到內存先,而IQueryable<T>
是將Skip
,Take
這些方法表達式翻譯成T-SQL
語句以後再向SQL
服務器發送命令,它並非把全部數據都加載到內存裏來才進行條件過濾。