Linq提供程序的目的是基本上將Linq表達式樹(它們構建在查詢的後面)轉換爲數據源的本地查詢語言。在數據已經在內存中的情況下,您不需要Linq提供程序; Linq 2對象很好。但是,如果您正在使用Linq與外部數據存儲(如DBMS或雲)進行對話,則這是絕對必要的。
任何查詢結構的基本前提是數據源的引擎應該儘可能地做大量的工作,並且只返回客戶端需要的數據。這是因爲數據源被假定爲最好地知道如何管理其存儲的數據,並且因爲數據的網絡傳輸在時間上相對昂貴,因此應該最小化。現在,實際上,第二部分是「僅返回客戶請求的數據」;服務器不能讀取你的程序的頭腦,並知道它真的需要什麼;它只能提供它的要求。這是一個智能的Linq提供者絕對會吹走一個「天真」的實現。使用生成表達式樹的Linq的IQueryable端,Linq提供者可以將表達式樹轉換成SQL語句,DBMS將使用該語句返回客戶端在Linq語句中要求的記錄。一個幼稚的實現需要使用一些廣泛的SQL語句來檢索所有記錄,以便向客戶端提供內存對象列表,然後所有的篩選,分組,排序等工作都由客戶端完成。
例如,假設您正在使用Linq從其主鍵的DB表中獲取記錄。一個Linq提供者可以將dataSource.Query<MyObject>().Where(x=>x.Id == 1234).FirstOrDefault()
轉換成「SELECT TOP 1 * from MyObjectTable WHERE Id = 1234」。這會返回零個或一個記錄。一個「天真」的實現可能會向服務器發送查詢「SELECT * FROM MyObjectTable」,然後使用Linq的IEnumerable端(對內存類起作用)進行過濾。在一份聲明中,您希望從一張擁有1000萬條記錄的表格中產生0-1個結果,您認爲哪些方法可以更快地完成這項工作(甚至可以工作,而不會耗盡內存)?
不確定爲什麼linq-to-excel從IQueryable中獲利,但有些情況會使代碼更快。 – CodesInChaos 2010-12-10 16:41:06