C# 林奇集团的物业业绩

C# 林奇集团的物业业绩,c#,performance,linq,database-performance,C#,Performance,Linq,Database Performance,受这篇文章启发的参数化查询 我得到了一个很好的参数化查询,但在性能上有一个缺点 public static void GetExpensesBy<TKey>( Func<Obj, TKey> myGroupingProperty) { var query = (from item in dataset orderby item.ExpenseTime descending

受这篇文章启发的参数化查询 我得到了一个很好的参数化查询,但在性能上有一个缺点

 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)
在13000行的表格中,差异约为2秒与0.1秒


您知道如何改进第一个语法以提高性能吗?

更改
表达式的参数类型

public static void GetExpensesBy<TKey>( Expression<Func<Obj, TKey>> myGroupingProperty)
{
 //...
}
公共静态void GetExpensesBy(表达式myGroupingProperty)
{
//...
}

传递一个
Func
您正在从
IEnumerable

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

因此,区别可能在于第二个查询在数据源中分组,而第一个查询在内存中提取所有数据并分组


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

这是因为您的
Func
是在本地执行的,而不是在服务器上执行的。请看,一致意见是“不,他们不应该”!相关:
public static void GetExpensesBy<TKey>( Expression<Func<Obj, TKey>> myGroupingProperty)
{
 //...
}