1)IQueryable
實質上代表一個查詢,當執行時將產生一系列結果。必須從IQueryable.GetEnumerator中調用IQueryProvider.Execute嗎?
a)我假設我們通過直接調用IQueryProvider.Execute
(立即執行)並傳入表達式樹或通過調用IQueryable.GetEnumerator
(執行執行)來執行查詢?
b)是否IQueryProvider.Execute
實際上將表達式樹轉換爲目標語言(比如SQL),然後從數據庫中檢索結果?
2)
public class Query<T> : IQueryable<T> ...
{
...
public IEnumerator<T> GetEnumerator()
{
return((IEnumerable<T>)this.provider.Execute(this.expression)).GetEnumerator();
}
}
Query<string> someQuery = new Query<string>();
foreach (var item in someQuery) { ... }
a)在上面的例子中查詢由調用的foreach執行someQuery.GetEnumerator
。我假設爲了使查詢實際執行,必須從someQuery.GetEnumerator
(通過this.provider.Execute
)調用IQueryProvider.Execute
?
謝謝
編輯
1)
如果查詢從可查詢的方法返回,則遞延 到的GetEnumerator()或執行()被調用。
我意識到查詢從IQueryable
返回的遞延,但似乎你暗示的查詢(那些實施IQueryable
)也可以從非可查詢的方法(在這種情況下,他們不遞延)退還?
2)
這是如何LINQ到SQL做的。但是,由於其 ObjectQuery提供程序已具有準備執行的目標實現特定的 命令樹,因此在調用GetEnumerator()時,似乎LINQ到實體 繞過了IqueryProvider。
我剛開始學習LINQ到實體,但似乎ObjectQuery<>
既是一個查詢和一個特定的供應商,同時與LINQ到SQL(不知道任何的LINQ到SQL,所以我只是猜測)查詢用IQueryable<>
代表,提供者用IQueryProvider
代表?
你能看到我的編輯? – user702769
__1)__我的意思是在理論上或技術上,可以實現預執行的非標準查詢。 __2)__'IQueryable'和'IQueryProvider'都是LINQ標準接口。 'IQueryable'('IQueryable '繼承)需要'IQueryProvider'作爲其'Provider'屬性。實際上LINQ-to-SQL的'表'實現了'IQueryable'和'IQueryProvider'。對於實體,一個單獨的類ObjectQueryProvider(內部)用於IQueryProvider。 –
非常感謝 – user702769