我有點困惑接口實際代表什麼。是一個IQueryable查詢還是隻能查詢一個對象?
IQueryable
的MSDN文檔說:「提供了針對特定數據源的評估查詢的功能。」
IQueryProvider
的文檔說:「定義創建和執行由IQueryable對象描述的查詢的方法。」
名稱和文檔摘要表明它是可以查詢的對象/數據存儲。第二個引號和實體框架的ObjectQuery
類實現IQueryable
的事實表明它是一個可以執行的查詢。
我誤解了一些東西,還是真的有些模糊?
我有點困惑接口實際代表什麼。是一個IQueryable查詢還是隻能查詢一個對象?
IQueryable
的MSDN文檔說:「提供了針對特定數據源的評估查詢的功能。」
IQueryProvider
的文檔說:「定義創建和執行由IQueryable對象描述的查詢的方法。」
名稱和文檔摘要表明它是可以查詢的對象/數據存儲。第二個引號和實體框架的ObjectQuery
類實現IQueryable
的事實表明它是一個可以執行的查詢。
我誤解了一些東西,還是真的有些模糊?
IQueryable
代表查詢本身。它將有一個與之關聯的數據源,但它不是數據存儲本身。特別是,它通常不會存儲所有的數據。
你可能會想到它有點像一個SqlCommand
對象 - 它有這個查詢,它知道要求數據的內容,但它不包含數據istelf。
但是爲什麼它被稱爲IQueryable呢?這是我混亂的主要來源。那麼IQuery將是一個更合適的名稱。 – Albic 2009-12-28 14:10:31
@Albic:恐怕我不知道命名方面。 – 2009-12-28 17:39:25
IQueryable
表示可以針對其執行查詢的源。它可以是SQL服務器上的表格或內存中對象集合的表示。
IQueryProvider
表示可以創建和執行由表達式樹表示的查詢的對象。例如,LINQ-to-SQL查詢提供程序將採用表達式樹並返回一個IQueryable
,該列表允許您在枚舉之前枚舉(通過編寫查詢)來進行枚舉(以獲得結果)或進一步優化。
MSDN上有一個非常好的walkthrough創建自己的IQueryProvider
。我認爲如果你做這個演練,你會有更好的理解。
表達式表示查詢本身,對吧?另一方面,IQueryProvider.CreateQuery
IQueryable表示兩個(可以說是非常不同的)事物。它以引用形式描述某些代碼的表達式樹和數據源的形式,以對提供者的引用的形式表示查詢,該提供者知道如何執行查詢。
我認爲你的困惑源於文檔只能談論IQueryable實際定義的方法這一事實。 IQueryable的大部分功能來自其在Queryable類中定義的相關擴展方法的實現,但它們不是IQueryable接口的嚴格組成部分。
有趣!
更新:重讀您的問題,另一個有用的見解是,查詢本身是可查詢。這是啓用LINQ組合性的關鍵。所以IQueryable是一個查詢,它是可查詢的 - 所以在類型名稱中沒有矛盾。
您是否嘗試閱讀IQueryable接口的「備註」部分?它有額外的信息和解釋。 – 2009-12-28 19:10:58