2011-09-27 83 views
1

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代表?

回答

2

1.A)IQueryable<T>查詢通常是通過經由foreach循環調用IEnumerable<T>.GetEnumerator()(往往不是)執行。您也可以使用IQueryable.Execute(),它也會執行查詢,但您必須從返回的IExecuteResult對象中投出結果。如果查詢是從Queryable方法返回的,那麼它將被調用,直到調用GetEnumerator()Execute()

1.B)是,IQueryProvider.Execute需要一個實現特定Expression並將其轉換爲特定於實現的目標表,並執行該實現背襯代碼(例如,數據庫或Web服務)。

2.a)這就是LINQ到SQL的做法。然而,當調用GetEnumerator()時,LINQ到實體似乎繞過IQueryProvider,因爲它的提供者已經準備好執行目標實現特定的命令樹。

+0

你能看到我的編輯? – user702769

+1

__1)__我的意思是在理論上或技術上,可以實現預執行的非標準查詢。 __2)__'IQueryable '和'IQueryProvider'都是LINQ標準接口。 'IQueryable'('IQueryable '繼承)需要'IQueryProvider'作爲其'Provider'屬性。實際上LINQ-to-SQL的'表'實現了'IQueryable'和'IQueryProvider'。對於實體,一個單獨的類ObjectQueryProvider(內部)用於IQueryProvider。 –

+0

非常感謝 – user702769

相關問題