NHibernate标准和公式

时间:2011-02-08 09:23:11

标签: nhibernate nhibernate-criteria

我有一个设置,我有一个包含两个字段的表,FirstName和LastName。要在名称中进行搜索,我制作了一个包含FirstName + " " + Lastname

的公式

但如果我尝试做以下陈述:

Restrictions.InsensitiveLike("empl.FullNameFormula", "% " + restriction.PersonName + " %")

我收到错误:

“超时已过期。操作完成前经过的超时时间或服务器没有响应。”

但是,如果我尝试做一个平等的而不是像它一样有效:

 Restrictions.Eq("empl.FullNameFormula", "% " + restriction.PersonName + " %")

公式是否有错误,并且尝试做一个不敏感的问题?

我正在使用NHibernate版本2.1.2.4000。

更新 我的堆栈跟踪看起来像这样:

    [SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +1951450
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4849003
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194
   System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2394
   System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33
   System.Data.SqlClient.SqlDataReader.get_MetaData() +83
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +297
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +954
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
   System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() +12
   NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) +216
   NHibernate.Impl.MultiCriteriaImpl.GetResultsFromDatabase(IList results) +310
   NHibernate.Impl.MultiCriteriaImpl.List() +348
   NHibernate.Impl.FutureCriteriaBatch.GetResultsFrom(IMultiCriteria multiApproach) +10
   NHibernate.Impl.FutureBatch`2.GetResults() +88
   NHibernate.Impl.FutureBatch`2.get_Results() +16
   NHibernate.Impl.FutureBatch`2.GetCurrentResult(Int32 currentIndex) +52
   NHibernate.Impl.<>c__DisplayClass4`1.<GetEnumerator>b__3() +53
   NHibernate.Impl.<get_Enumerable>d__0.MoveNext() +73
   System.Linq.Buffer`1..ctor(IEnumerable`1 source) +259
   System.Linq.Enumerable.ToArray(IEnumerable`1 source) +81
   xxx.DataAccess.PublicationRepository.Search(PublicationQuery restriction) in xxxx :197
   layouts_www_xxx.RunSearch() in xxx:100
   layouts_www_xxx.OnInit(EventArgs e) in xxxx :39
   System.Web.UI.Control.InitRecursive(Control namingContainer) +333
   System.Web.UI.Control.InitRecursive(Control namingContainer) +210
   System.Web.UI.Control.InitRecursive(Control namingContainer) +210
   System.Web.UI.Control.InitRecursive(Control namingContainer) +210
   System.Web.UI.Control.InitRecursive(Control namingContainer) +210
   System.Web.UI.Control.InitRecursive(Control namingContainer) +210
   System.Web.UI.Control.InitRecursive(Control namingContainer) +210
   System.Web.UI.Control.InitRecursive(Control namingContainer) +210
   System.Web.UI.Control.InitRecursive(Control namingContainer) +210
   System.Web.UI.Control.InitRecursive(Control namingContainer) +210
   System.Web.UI.Control.InitRecursive(Control namingContainer) +210
   System.Web.UI.Control.InitRecursive(Control namingContainer) +210
   System.Web.UI.Control.InitRecursive(Control namingContainer) +210
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +378

2 个答案:

答案 0 :(得分:1)

您可能在FirstName上有一个帮助第一个查询的索引,而第二个正在进行昂贵的表扫描。

答案 1 :(得分:1)

  

我会看到实际的SQL是什么   正在生成,你提到这一点   是一个更大的搜索的一部分...

基于此,我要么: -

a)启动SQL事件探查器并查看正在生成的SQL并在SQL Management Studio

中运行它

b)下载NHProf并获取SQL并在SQL Management Studio中运行

c)使用Log4Net输出生成的SQL并在SQL Management Studio中运行

我假设这是一个MsSQL服务器,如果不使用MySql Workbench。

这确实可以解决SQL数据库问题,而不是NHibernate问题。如果没有先检查SQL,你可能会咆哮错误的树。

HTH