Linq按属性分组的性能

4

在受到这篇帖子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行的表格中,两者之间的差异约为2秒与0.1秒。

你是否有任何想法如何改进第一种语法以提高性能?


2
这是因为你的 Func<> 是在本地执行而不是在服务器上执行。 - Jeroen van Langen
请参见"问题标题中是否应包含“标签”?",共识是“不应该”! - user57508
2个回答

4

更改 Expression 的参数类型:

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

当你从 IEnumerable<T> 调用 GroupBy 时,需要传递一个 Func<T>


3
好的,我会尽力进行翻译。以下是需要翻译的内容:相关网址:https://dev59.com/0XRA5IYBdhLWcg3w4SDo为什么要使用 expression(funct) 而不是 funct? - Oliver

3
没有了解到 dataset 是什么,很难确定问题。但是如果它是一个 IQueryable,那么两者之间的区别在于,你的第一个查询(因为它需要一个 Func 参数)使用了 IEnumerable 扩展并在内存中进行分组。第二个示例将你的 lambda 编译为一个 Expression,因此将分组表达式添加到基本查询中,并尽可能地传递给提供程序。所以不同之处可能在于第二个查询是在数据源中进行分组,而第一个查询则是将所有数据拉入内存中再做分组。
只需将参数从 Func<Obj, TKey> 更改为 Expression<Func<Obj, TKey>>,然后查看是否有帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接