2016-04-04 82 views
3

關於受此博文啓發的參數化查詢LINQ group by property as a parameter 我已經獲得了一個很好的可參數化查詢,但是在性能上有一個缺點。Linq group by property performance

public static void GetExpensesBy<TKey>(Func<Obj, TKey> myGroupingProperty) 
    { 
     var query = (from item in dataset 
        orderby item.ExpenseTime descending 
        select item).GroupBy(myGroupingProperty); 
     // .... 
    } 
    // .. 
    GetExpensesBy(p=> p.Column) 

比直接查詢

var query = (from item in expense 
        orderby item.ExpenseTime descending 
        select item).GroupBy(p => p.Column); 

相差大約在13000行的表2S VS 0.1秒慢得多。

你有什麼想法如何改進第一個語法來提高性能?

+2

那是因爲你'Func鍵<>執行'地方,而不是在服務器上 –

+0

請參見[56,「問題‘’包括在他們的頭銜?」標籤(http://meta.stackexchange.com/questions/ 19190 /應疑問的包括標籤功能於他們-冠軍),其中的共識是「不,他們不應該」! –

回答

4

更改參數類型爲Expression

public static void GetExpensesBy<TKey>(Expression<Func<Obj, TKey>> myGroupingProperty) 
{ 
//... 
} 

傳遞一個Func<T>您呼叫GroupByIEnumerable<T>

+3

相關:http://stackoverflow.com/questions/793571/why-would-you-use-expressionfunct-rather-than-funct – Oliver

+0

很好的參考,謝謝@Oliver – octavioccl

+0

正是我需要的,非常感謝你! –

2

很難說肯定不知道什麼dataset是的,但如果它是一個IQueryable,那麼兩者之間的一個區別是,您的第一個查詢(因爲它需要Func參數)正在使用IEnumerable擴展名並執行內存中的分組。第二個示例是將您的lambda編譯爲Expression,從而將分組表達式添加到基本查詢中,並在可能的情況下將其傳遞給提供者。

所以區別可能是第二個查詢在數據源中分組,而第一個查詢是在所有數據和內存中分組。

只需將您的參數從Func<Obj, TKey>改爲Expression<Func<Obj, TKey>>,看看是否有幫助。