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)
{
//...
}