Критерий и формула NHibernate - PullRequest
       7

Критерий и формула NHibernate

0 голосов
/ 08 февраля 2011

У меня есть настройки, где у меня есть таблица с двумя полями, 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 ]

1 голос
/ 08 февраля 2011

Я бы посмотрел, что генерируется фактический SQL, вы упомянули, что это часть гораздо большего поиска ...

Так что, основываясь на этом, я бы либо: -

a) Запустите SQL Profiler, посмотрите, что генерируется SQL, и запустите его в SQL Management Studio

b) Загрузите NHProf , захватите SQL и запустите SQLManagement Studio

в) Используйте Log4Net для вывода сгенерированного SQL и запуска в SQL Management Studio

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

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

HTH

1 голос
/ 08 февраля 2011

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

...