受此帖子启发的可参数化查询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。
您是否知道如何改进第一种语法以提高性能?
答案 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>>
,看看是否有帮助。