0

FirstName と LastName の 2 つのフィールドを持つテーブルがあるセットアップがあります。名前で検索するために、 を含む数式を作成しましたFirstName + " " + Lastname

しかし、次のステートメントを実行しようとすると:

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

次のエラーが表示されます。

「タイムアウトが発生しました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。」

しかし、like の代わりに equal を実行しようとすると、次のように機能します。

 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
4

2 に答える 2

1

おそらく、FirstNameに最初のクエリを支援するインデックスがあり、2番目のインデックスは高価なテーブルスキャンを実行しています。

于 2011-02-08T12:53:12.637 に答える
1

実際の SQL が生成されているのがわかりますが、これははるかに大規模な検索の一部だとおっしゃいました...

したがって、これに基づいて、次のいずれかを行います:-

a) SQL プロファイラーを起動し、生成されている SQL を確認し、これを SQL Management Studio で実行します

b) NHProfをダウンロードして SQL を取得し、SQL Management Studio で実行します。

c) Log4Net を使用して、生成された SQL を出力し、SQL Management Studio で実行します。

MySql Workbenchを使用しない場合、これはMsSQLサーバーであると想定しています。

これは、NHibernate の問題ではなく、SQL データベースの問題の匂いがします。最初に SQL をチェックしないと、間違ったツリーを吠えている可能性があります。

HTH

于 2011-02-08T16:16:38.977 に答える