2016-04-04 9 views
3

この投稿にインスパイアされたパラメータ設定可能なクエリLINQ group by property as a parameter 私は良いparametrizableクエリを取得しましたが、パフォーマンスに1つの欠点があります。プロパティのパフォーマンス別Linqグループ

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) 

差は13000行のテーブルに0.1秒対2秒程度で直接クエリ

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

よりもはるかに遅いです。

パフォーマンスを向上させるための最初の構文を改善する方法はありますか?

+2

これは、あなたの 'Func <>'がサーバーではなくローカルで実行されているからです。 –

+0

["質問には"タイトルに "タグ"を含める必要がありますか?]](http://meta.stackexchange.com/questions/ 19190/should-questions-include-tags-in-their-titles)、コンセンサスは「いいえ、彼らはすべきではありません」です! –

答えて

4
Expressionのためのあなたのパラメータの型を変更し

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

datasetが何であるかを知らなくてもIEnumerable<T>

+3

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

+0

優秀なリファレンス、ありがとう@Oliver – octavioccl

+0

まさに私が必要としたこと、ありがとう! –

2

確実に伝えるのは難しいから、あなたがGroupBy呼び出しているFunc<T>を渡すが、それはIQueryableであれば、最初のクエリ(Func引数を取るので)は、IEnumerable拡張を使用し、メモリ内のグループ化を実行していることです。 2番目の例ではラムダをExpressionにコンパイルしており、可能であればベースクエリにグループ化式を追加してプロバイダに渡しています。

したがって、2番目のクエリはデータソース内でグループ化されていますが、最初のクエリはメモリ内のすべてのデータとグループを取得している可能性があります。

パラメータをFunc<Obj, TKey>からExpression<Func<Obj, TKey>>に変更して、それが役立つかどうかを確認してください。

関連する問題