使用动态表达式<func <t,x>&gt;的含义在NHibernate中</func <t,x>

时间:2013-03-20 05:42:28

标签: linq nhibernate dynamic expression func

基本上在我的应用程序中,我使用以下代码来构建表达式,具体取决于页面上的选择。

Expression<Func<T, bool>> expr = PredicateBuilder.True<T>();
expr = expr.And(b => b.Speed >= spec.SpeedRangeFrom && b.Speed <= spec.SpeedRangeTo);
...

它倾向于最终表达多个&#34;或&#34;和&#34;和&#34;条件。

完成构建表达式后,我将其传递到我的存储库,如下所示:

var results = Session.Query<T>().Where(expr).ToList();

问题是我花了这么长时间才把结果归还给我。我还注意到表达式越长,返回结果集所需的时间就越长。

我还使用NHibernate profiler来分析生成的sql语句。在SQL Server Studio上单独运行sql语句,只需不到1秒。

在我看来,大部分时间花在构建或转换表达式为sql语句。

有没有办法解决这个问题?

我在使用NHibernate方面没有多少经验。如果有人能对此有所了解,那就太棒了。

提前感谢您花时间阅读本文。

1 个答案:

答案 0 :(得分:1)

超过返回的行数,表格中的总行数很重要。

  

在SQL Server Studio上单独运行sql语句   只有不到1秒。

以这种方式测试可能会产生误导。第二轮查询受益于先前编译的SQL语句,先前计算的查询执行计划,先前填充的数据缓冲区。 此外,通过直接在sql中替换所有参数名称及其值来进行测试将导致不同的执行计划。

我要做的第一件事就是检查索引的错误用法(缺少相关索引或过时的统计数据)

这可以通过查看估计的查询执行计划来完成。 至于统计数据,请查看:https://dba.stackexchange.com/q/12004

我想这也应该有用:Query executed from Nhibernate is slow, but from ADO.NET is fast

请参阅下文,了解如何使用稍微清理的环境测试SQL-SERVER语句。

为每个查询运行此批处理以比较执行时间和统计结果(不在生产环境中运行):

DBCC FREEPROCCACHE
GO

CHECKPOINT 
GO

DBCC DROPCLEANBUFFERS 
GO

SET STATISTICS IO ON
GO

SET STATISTICS TIME ON
GO

-- your query here
GO

SET STATISTICS TIME OFF
GO

SET STATISTICS IO OFF
GO