Linq group by property performance

时间:2016-04-04 14:21:17

标签: c# performance linq database-performance

受此帖子启发的可参数化查询LINQ group by property as a parameter 我已经获得了一个很好的可参数化查询,但是在性能方面有一个缺点。

 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.1s。

您是否知道如何改进第一种语法以提高性能?

2 个答案:

答案 0 :(得分:4)

更改Expression的参数类型:

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

从[{1}}

传递Func<T>您正在呼叫GroupBy

答案 1 :(得分:2)

在不知道dataset是什么的情况下很难确定,但如果它是IQueryable,那么两者之间的一个区别就是您的第一个查询(因为它需要Func参数)正在使用IEnumerable扩展并在内存中进行分组。第二个示例是将lambda编译为Expression,从而将分组表达式添加到基本查询中,如果可能,将其传递给提供程序。

因此,差异可能是第二个查询在数据源中进行分组,而第一个查询是在内存中提取所有数据和分组。

只需将参数从Func<Obj, TKey>更改为Expression<Func<Obj, TKey>>,看看是否有帮助。