2011-02-08 20 views
0

私は、FirstNameとLastNameの2つのフィールドを持つテーブルを持っています。名前を検索するには、FirstName + " " + Lastnameという数式を作成しました。NHibernateの基準と式

しかし、私は次のステートメントを実行しようとします

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

最初のステートメントに生成されるSQLは何ですか?これを見つけ出し、問題を追跡するためにデータベースに対して実行します。私はここでDBの問題を疑う。 – 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...

だから、これに基づいて、私はどちらかになります -

a)のSQLプロファイラを起動し、生成されるSQLを確認し、SQL Management Studioを

Bでこれを実行する)NHProfをダウンロードし、 SQL Management Studioで生成されたSQLと実行SQLを取得し、出力にSQL Management Studioで

c)の使用log4netの実行

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

これは実際にはSQLデータベースの問題ではなく、NHibernateの問題ではありません。最初にSQLをチェックしなければ、間違ったツリーを吠えることになります。

HTH

+0

私はエラーを見つけられませんでしたが、私は答えとしてあなたの投稿をマークするエラーをデバッグする方法の良い説明をしたので、働いていた修正を見つけました。 – Dofs

+0

ありがとう@Dofs、私は何が間違っていたかに興味を持っています。 – Rippo

1

秒1は、高価なテーブルスキャンを行っている間、あなたはおそらく、最初のクエリを支援している姓にインデックスを持っています。

+0

meh、数千の行でタイムアウトには不十分です – Jaguar

+0

完全なスタックトレースで実際の例外を送信してください。 –

関連する問題