2009-12-27 170 views
2

我有點困惑接口實際代表什麼。是一個IQueryable查詢還是隻能查詢一個對象?

IQueryable的MSDN文檔說:「提供了針對特定數據源的評估查詢的功能。」

IQueryProvider的文檔說:「定義創建和執行由IQueryable對象描述的查詢的方法。」

名稱和文檔摘要表明它是可以查詢的對象/數據存儲。第二個引號和實體框架的ObjectQuery類實現IQueryable的事實表明它是一個可以執行的查詢。

我誤解了一些東西,還是真的有些模糊?

+0

您是否嘗試閱讀IQ​​ueryable接口的「備註」部分?它有額外的信息和解釋。 – 2009-12-28 19:10:58

回答

2

IQueryable代表查詢本身。它將有一個與之關聯的數據源,但它不是數據存儲本身。特別是,它通常不會存儲所有的數據。

你可能會想到它有點像一個SqlCommand對象 - 它有這個查詢,它知道要求數據的內容,但它不包含數據istelf。

+0

但是爲什麼它被稱爲IQueryable呢?這是我混亂的主要來源。那麼IQuery將是一個更合適的名稱。 – Albic 2009-12-28 14:10:31

+0

@Albic:恐怕我不知道命名方面。 – 2009-12-28 17:39:25

1

IQueryable表示可以針對其執行查詢的源。它可以是SQL服務器上的表格或內存中對象集合的表示。

IQueryProvider表示可以創建和執行由表達式樹表示的查詢的對象。例如,LINQ-to-SQL查詢提供程序將採用表達式樹並返回一個IQueryable,該列表允許您在枚舉之前枚舉(通過編寫查詢)來進行枚舉(以獲得結果)或進一步優化。

MSDN上有一個非常好的walkthrough創建自己的IQueryProvider。我認爲如果你做這個演練,你會有更好的理解。

+0

表達式表示查詢本身,對吧?另一方面,IQueryProvider.CreateQuery 方法返回IQueryable 。這個不一致的命名讓我感到困惑。 – Albic 2009-12-28 14:18:23

1

IQueryable表示兩個(可以說是非常不同的)事物。它以引用形式描述某些代碼的表達式樹和數據源的形式,以對提供者的引用的形式表示查詢,該提供者知道如何執行查詢。

我認爲你的困惑源於文檔只能談論IQueryable實際定義的方法這一事實。 IQueryable的大部分功能來自其在Queryable類中定義的相關擴展方法的實現,但它們不是IQueryable接口的嚴格組成部分。

有趣!

更新:重讀您的問題,另一個有用的見解是,查詢本身是可查詢。這是啓用LINQ組合性的關鍵。所以IQueryable是一個查詢,它是可查詢的 - 所以在類型名稱中沒有矛盾。

相關問題