中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何提高Linq查詢的性能(上)

發布時間:2020-06-22 14:59:18 來源:網絡 閱讀:4225 作者:yanyangtian 欄目:編程語言
如何提高Linq查詢的性能(上)
       自從Linq提出了之后,讓很多的開發人員一陣的狂喜,編寫代碼似乎比以前更別的方便了,特別是隨著Linq2Sql等推出來之后,開發人員感到了似乎手中有了強大的武器。同時,Linq2Sql帶來的問題不斷的出現,特別實在性能上面,這是讓很多的多性能有著高要求的應用要放棄Linq2Sql系列技術的原因,并且很多回到了以前的ADO.NET技術,追求完全的控制。
 
系列文章 
如何提高Linq查詢的性能(上)
如何提高Linq查詢的性能(下)
 
       這里和大家分享一些知識。我們本篇文章不對談了Linq系列技術是否好,是否改用,而是告訴那些將會或者已經使用了Linq技術的朋友,如何來提升Linq2Sql查詢的性能。
              
在本篇文章中,我們首先會介紹Linq2Sql查詢是如何被執行的,然后我們介紹如何來編譯Linq查詢從而使得其性能提升。
本篇希望大家對Linq2Sql查詢,特別是Linq2Sql的使用有一定的經驗。
 
本篇的議題如下:
深入的查看Linq2Sql查詢的工作原理(上)
如何編寫編譯的Linq查詢(上)
性能比較(下)
結果分析(下)
 
深入的查看Linq2Sql查詢的工作原理
 
       首先我們來看看下面的一個簡單的Linq查詢,這個查詢非常的簡單,就是從一個Customer表中獲取數據,這個Linq的查詢被Linq的引擎轉換為SQL語句,如下:
 
如何提高Linq查詢的性能(上)
 
              
 
       對于一個Linq查詢,首先,需要檢查它的語法,詞法,最后產生SQL語句。這個過程可以說是非常耗時的,并且對于每個Linq查詢都要這樣做。如果我們可以將每一個Linq查詢的查詢計劃緩存的話,那么就快了。
 
       其實這個原理和我們使用SQL Server一樣:把SQL Server提交到數據庫,首先執行詞法語法分析,然后生成查詢樹,然后再交給查詢優化器,生成執行計劃,然后交給執行引擎去執行,最后又存儲引擎獲取數據,并且生成的執行計劃被緩存,以便重用,這樣就極大的提升了性能,更多請看這里。
              
       在Linq技術中,提供了一種名為編譯Linq查詢的技術。在編譯的Linq查詢中,Linq生成的執行計劃被緩存在一個靜態的類中。我們知道,靜態類是一個全局的公共資源,所以Linq查詢可以去這個靜態類中找到相應的執行計劃,而不是每次都去解析,如下:
 
如何提高Linq查詢的性能(上)
 
       從上圖中可以看到:從Linq的查詢到最后的執行解析成為SQL去執行,需要經歷四個步驟,如果沒有緩存Linq查詢的執行計劃,那么其實就是有5個步驟的,如下:
 
如何提高Linq查詢的性能(上)
 
 
如何編寫編譯的Linq查詢
 
既然已經知道了編譯查詢可以提升性能,那么我們就來看看具體的如何操作。
首先就要導入System.Data.Linq命名空間。
然后,為了避免一上來就丟上一大堆代碼使得朋友們不舒服,我們就一點點的來進行:
    1. 首先定義一個靜態的類:clsCompiledQuery
    2. 然后添加一個公共的靜態方法指針變量,簽名如下: 
如何提高Linq查詢的性能(上)
 
那么對于這個方法:
a. 這個方法的參數要首先接受一個DataContext對象
b. 這個方法可以隨后接受一個或者多個輸入參數,現在在我們的例子中,我們就接受了一個string類型的輸入參數,因為我們的上面的customer的查詢只是傳入了一個txtCustomer.Text的值。
c. 我們需要定義類型為IQueryable的輸出參數。
 
 
3. 定義好了方法指針的變量之后,我們就可以調用CompiledQuery類的方法Compiled,并且將DataContext與一個string作為輸入參數,如下:
 
如何提高Linq查詢的性能(上)
 
 
4. 整個方法指針的定義完整代碼如下: 
如何提高Linq查詢的性能(上)
5.整個靜態類的定義如下: 
如何提高Linq查詢的性能(上)
 
上面的準備工作做好了之后,我們就開始使用。可以在需要的地方進行如下的調用:
 
如何提高Linq查詢的性能(上)
 
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

资中县| 霍州市| 泰安市| 宣城市| 沂南县| 紫金县| 横峰县| 婺源县| 兴城市| 锦州市| 佛教| 新田县| 呼伦贝尔市| 会宁县| 玉屏| 无为县| 南投市| 兖州市| 敖汉旗| 荆州市| 色达县| 沙雅县| 舟山市| 茌平县| 巫溪县| 苗栗市| 桃园县| 杂多县| 维西| 灌南县| 新巴尔虎左旗| 伊宁县| 榆林市| 电白县| 邵武市| 姜堰市| 基隆市| 丽江市| 青神县| 沙洋县| 东丽区|