2017-04-18 44 views
1

我想使用LINQ和LAMBDA表達式查詢ORACLE數據庫中的表。使用group by子句時,獲取數據的時間大大增加。按條件表達式組 - Linq

在下面的代碼塊中,有一個由表達式組成的條件。

using (var entities = new Entities()) 
{ 
    var result = entities.myTable.Where(a => a.COLUMNONE > 1) 
     .GroupBy(g => new { columnForGrouping = (g.COLUMNTWO > 50 ? "Group1" : "Group2") }) 
     .Select(sel => new { 
      columnGroup = sel.Key.columnForGrouping, 
      count = sel.Count() 
     }).ToList(); 
} 

我想知道這種類型的表達式有多高效?而且,它有更好的嗎?

+0

順便說一句,如果僅由一個值進行分組,則不需要創建匿名對象。可以改爲'.GroupBy(g => g.COLUMNTWO> 50?「Group1」:「Group2」)' –

+0

我不認爲有一種內在的更好的方式來做到這一點。您的性能影響也可能是由數據庫中的索引(或更確切地說,缺乏)引起的,因此需要考慮太多因素。 –

+0

看起來很好。請顯示執行的查詢的sql和解釋計劃? –

回答

-1

Linq SQL查詢效率不高,特別是對於group by和joins。強烈建議優化查詢並直接使用。

在我的一個案例中,將時間從12秒縮短到3秒。

+2

他們爲什麼不高效?只要你做好程序員的工作,他們就可以。錯誤代碼會產生錯誤的查詢 –

+1

我同意帕特里克。如果你不優化你的查詢,無論你使用什麼,你的查詢將會運行得更慢。 – Tunahan

2

下列指示可能導致性能問題:

CAST("Extent1"."COLUMNTWO" AS number(10,0))) 

演員在SQL可能會產生意外的行爲表現,明智的。我建議你使用不同的數據類型。

+0

在幾乎所有的比較中,lambda都進行了類型轉換。我不認爲這是因爲演員表演不同,但我也會檢查。感謝您的回答。 – Tunahan

+0

不客氣,試試看。 –

+0

我回顧了我的複雜查詢。有很多CAST行動。然後,我清除了代碼。性能提高了大約百分之三十。感謝您的意見。 – Tunahan