Linq 按 属性 性能分组
Linq group by property performance
受此启发的可参数化查询 post 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 行的 table 中,差异约为 2 秒与 0.1 秒。
您知道如何改进第一个语法以提高性能吗?
更改 Expression
的参数类型:
public static void GetExpensesBy<TKey>( Expression<Func<Obj, TKey>> myGroupingProperty)
{
//...
}
传递 Func<T>
您正在从 IEnumerable<T>
呼叫 GroupBy
在不知道 dataset
是什么的情况下很难确定,但如果它是 IQueryable
,那么两者之间的一个区别是您的第一个查询(因为它需要 Func
参数)正在使用 IEnumerable
扩展并在内存中进行分组。第二个示例是将您的 lambda 编译为 Expression
,从而将分组表达式添加到基本查询中,并在可能的情况下将其传递给提供程序。
所以区别可能是第二个查询是在数据源中分组,而第一个查询是拉入所有数据并在内存中分组。
只需将参数从 Func<Obj, TKey>
更改为 Expression<Func<Obj, TKey>>
,看看是否有帮助。
受此启发的可参数化查询 post 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 行的 table 中,差异约为 2 秒与 0.1 秒。
您知道如何改进第一个语法以提高性能吗?
更改 Expression
的参数类型:
public static void GetExpensesBy<TKey>( Expression<Func<Obj, TKey>> myGroupingProperty)
{
//...
}
传递 Func<T>
您正在从 IEnumerable<T>
GroupBy
在不知道 dataset
是什么的情况下很难确定,但如果它是 IQueryable
,那么两者之间的一个区别是您的第一个查询(因为它需要 Func
参数)正在使用 IEnumerable
扩展并在内存中进行分组。第二个示例是将您的 lambda 编译为 Expression
,从而将分组表达式添加到基本查询中,并在可能的情况下将其传递给提供程序。
所以区别可能是第二个查询是在数据源中分组,而第一个查询是拉入所有数据并在内存中分组。
只需将参数从 Func<Obj, TKey>
更改为 Expression<Func<Obj, TKey>>
,看看是否有帮助。