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>>,看看是否有帮助。