2015-07-10 128 views
1

我對查詢有點懷疑,它有點慢,我想知道什麼是最好的性能。linq到linq和lambda之間的實體查詢的性能?

讓目前的這第一個例子:

var result = from tableA in context.TableA 
      join tableB in context.TableB on tableA.id equals tableB.id 
      where *some conditions* 
      select new { 
       tableA.id, 
       tableA.name, 
       another_name = tableA.TableC.name 
       some_operation = tableB.price * tableB.TableD.some_coeficient 
       another_operation = tableB.TableE.Sum(c=> c.some_value) 
      }; 

這就是我現在所擁有的(此查詢後,我在另一個變量result.ToList()

彌問題是,如果是在各級更好地履行。性能進行:?

  1. 與Lambda表達式查詢保持select new {....} 部分
  2. ToList()後面的select new {....}部分的查詢?

你推薦我做什麼?

+0

你的where子句可能很重要,如果它變成SQL服務器找不到索引或沒有索引的東西,它可能會導致性能下降。 – Mant101

回答

3
  1. 它會完全一樣。查詢表達式基本上被轉換爲非查詢表達式的等價物。

  2. 你需要使用select new { tableA, tableB }或類似的東西,無論如何,這樣你就可以ToList後使用這兩個變量...但它很可能是爲則:

    • 所有字段會從數據庫中取出而不僅僅是那些被使用的數據
    • 在之後,所有的投影(包括Sum等)都會發生在之後,而不是從數據庫中獲取值。這很可能涉及到使更多的數據庫請求,訪問tableA.TableC

你應該看看生成的SQL,在SQL事件探查器中運行它制定出什麼是緩慢的,考慮更多的指標等。

+0

在查詢中有什麼更好的方法,可以在'tableA.TableC'這樣的'select new'上執行嵌套,或者在'TableC'上對查詢執行'join'? –

+0

@Phoeniz_uy:我建議你同時試試,同時檢查SQL和性能... –

3

將其更改爲lambda表達式不會影響性能 - 它們將被編譯到相同的SQL中。我建議使用像LinqPad這樣的工具來幫助確定正在生成的SQL。

你肯定希望做一個selectToList() ING雖然,因爲這隻會選擇從SQL需要的數據,但ToList()後做會做它在內存中。

+1

第二次使用LinqPad,迄今爲止調整Linq查詢的最快方法。 – Mant101