2011-08-13 59 views
1

在LINQ2SQL查詢下面可能有人告訴我表達式樹與LINQ2SQL

1)當SQL查詢發送到SQL Server?

一個)當查詢有或分配給它的表達

B)(延遲執行),當它在foreach循環是必需的?

var query = from c in myDataContext.Customers 
      where c.FirstName == 'Tom' 
      select c; 

foreach(customer cust in query) 
{ 
    //...do something 
} 

2)是否.NET應用程序或SQL Server轉換表達式樹成一個SQL查詢?我問這個的原因是因爲

一)所有我對錶達式樹進行讀取說,他們需要以跨線發送代碼能夠動態地而不是發送MSIL的執行。

B)如果我的表達被分配到之後懸停在查詢,我已經可以看到它已經改變了它到SQL

如果.NET應用程序會進行轉換,然後又怎能真的可以說表達式樹是通過電線發送到sql服務器的?它只是發送了SQL字符串。

回答

2
  1. 將查詢發送到數據庫時,它絕對必須是 - 通常當你真正開始請求數據。

    換句話說,它會可能是要麼是GetEnumerator()的呼叫,要麼是第一個呼叫IEnumerator<T>.MoveNext()

  2. C#編譯器將lambda表達式轉換爲IL,在執行時生成表達式樹對象。 LINQ to SQL然後將該表達式樹轉換爲SQL以發送到數據庫。需要

表達式樹的LINQ,以便有你的代碼的「數據」表示SQL,以便它可以被轉換在執行時的SQL。它仍然是通過線路發送的SQL,但需要表達式樹來創建該SQL。

有很多關於這類事情的博客帖子,其中包括this one by me

+0

回覆:1)確定了,所以我的示例不需要任何評估,因此執行被推遲到foreach調用IEnumerator .MoveNext(),但是如果我的查詢中有一個.Count,那麼查詢會立即執行。重新:2)如果這個過程如你所概述的那樣,怎麼說表達式樹是通過線傳送的?一切都在應用程序端進行評估並轉換爲SQL,然後發送到數據庫執行。 – FuzzyFrog

+0

@FuzzyFrog:表達式樹*不是通過線傳送的(至少對於LINQ to SQL) - 你讀到的是哪裏?請注意,「爲了通過線路發送代碼需要表達式樹」與「表達式樹通過線路發送」不同。在LINQ to SQL中,SQL *是翻譯後的代碼。 –

+0

感謝喬恩,我認爲你的筆記已經釘在我的理解在這件事上失敗的地方。所以說公理的說,表達式樹實際上只是存儲查詢表達式的一種便捷方式,可以在需要時進行遍歷並進行評估。 L2S使用它們是因爲它具有這種延遲執行類型行爲。 – FuzzyFrog