2013-01-23 64 views
5

我正在學習C#(C++背景),並且我有一個關於LINQ表達式的問題。以下兩個功能都做同樣的事情(接近我可以告訴)。 Wombats的類型是System.Data.Linq.Table<Wombat>比較兩種不同LINQ語句的效率

我想知道

  1. 哪個更有效?
  2. 它甚至很重要嗎?
  3. 有沒有什麼可以通過返回IQueryqble來獲得呢?
  4. 這裏有一些禮儀喜歡三者之一嗎?

我的猜測是第二個效率更高,但它並不重要,除非在袋熊表中有數以百萬計的袋熊。並且返回一個IQueryable似乎並不重要,因爲我們只是返回一個單一的袋熊。

在此先感謝!

public static DBConnector.Connections.Wombat getWombat(String wombatID) 
    { 
     var db = getDBInstance(); 
     return db.Wombats.FirstOrDefault(x => x.ID.ToString() == wombatID); 
    } 

    public static DBConnector.Connections.Wombat getWombat(String wombatID) 
    { 
     var db = getDBInstance(); 
     var guid = new System.Guid(wombatID); 
     return db.Wombats.FirstOrDefault(x => x.ID == guid); 
    } 
+9

我敢肯定你的意思是在你的第二個例子中== == guid' –

+1

在這一點上,你應該問一下'LinQ to SQL'的效率,這似乎是你正在使用的。 –

+0

@lc。我這樣做---我正在編輯變量名,並且一定錯過了這個。 – BenDundee

回答

7

這完全取決於DB的LINQ提供程序,以及它如何將其轉換爲SQL。你可以profile the resulting SQL(甚至只是inspecting the SQL trace),並確定哪個更有效。

我懷疑大多數提供者會用第二種方法做得更好,因爲實際檢查將是相同的類型 - 服務器上的查詢不需要將每行轉換爲字符串,並通過字符串比較進行比較。這可能會使索引正常工作,並使其效率更高。這就是說,一個聰明的提供商可以爲你做這種轉換,在這種情況下,這兩種選擇可能是相同的。

1

如果返回IQuerable,則可以延遲估計,讓其他人先更新值。

+0

啊好點。我不認爲我在這裏必須擔心這一點,但在將來肯定要記住一些事情。 – BenDundee

5

您的猜測是正確的,第二個查詢可能更有效,因爲它會解析GUID一次,而不是將每行中的GUID轉換爲字符串。查詢提供者可以優化這個,但它不必;您的查詢提供程序也可能會選擇將GUID轉換爲字符串進行比較,但這是一個相當不幸的選擇。

除非表中存在大量的Wombat對象,否則您也假設它無關緊要。

第二個查詢有一個明顯的區別:ToString方法可能無法被查詢提供程序識別,因此您的第一個查詢甚至不會由於運行時錯誤而執行。

+5

這取決於查詢提供程序的功能。請記住,這是一個'IQueryable ' - 它不像編寫*的代碼將要執行。 –

3
  1. 看看每個案例生成的sql。
  2. 檢查sql studio中每個查詢的執行時間,查詢計劃和IO。
  3. ???
  4. 利潤。
+1

+1 ... – BenDundee