2011-02-08 1 views
0

У меня есть настройка, где у меня есть таблица с двумя полями FirstName и LastName. Чтобы выполнить поиск в названии, я составил формулу, которая содержит FirstName + " " + Lastname.NHibernate Критерий и формула

Но если я пытаюсь сделать следующее заявление:

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

Я получаю сообщение об ошибке:

«Время ожидания истекло Время ожидания истекло до завершения операции или сервер не отвечает. «.

Но если я пытаюсь сделать равноправным вместо как он работает:

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

Есть ли ошибка с формулой и пытается сделать нечувствительным как?

Я использую NHibernate версии 2.1.2.4000.

Update: Мой StackTrace выглядит следующим образом:

[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 
+0

Что сгенерированный SQL для первого оператора, я бы найти это затем запустить его с базой данных, чтобы отследить вашу проблему. Я подозреваю, что проблема с БД здесь. – Rippo

+0

также указывать общую сумму таблицы, этот фрагмент выполнен на – Jaguar

+0

@ Jaguar: он будет выполнен на пару тысяч строк, поэтому ничего действительно большого. – Dofs

ответ

1

I would see what the actual SQL is being generated, you mention that this is part of a much larger search...

Так на основе этого я бы либо: -

а) Запустите SQL Profiler и посмотреть SQL который генерируется и запустите в управлении SQL Studio

б) Скачать NHProf и захватить SQL и запустить в SQL Management Studio

) использовать log4net для вывода сгенерированного SQL и работать в среде SQL Студия

Я предполагаю, что это сервер MsSQL, если не использовать MySql Workbench.

Это действительно запах проблемы базы данных SQL, а не проблема NHibernate. Без предварительной проверки SQL вы могли бы лаять неправильное дерево.

НТН

+0

Я не нашел ошибку, но я нашел исправление, которое сработало, поскольку вы дали хорошее объяснение того, как отлаживать ошибку. Я отмечаю ваше сообщение как ответ. – Dofs

+0

Спасибо @Dofs, я заинтригован, какая ошибка была. – Rippo

1

Вы, вероятно, индекс на FirstName, которая помогает первый запрос, в то время как второй один делает дорогостоящую сканирование таблицы.

+0

meh, пару тысяч строк недостаточно для тайм-аута – Jaguar

+0

Опубликуйте фактическое исключение с полным стеком. –