設定によりどちらのモ2ndレベルのキャッシュ、カスタムクエリー、sqldialect
-
20-09-2019 - |
質問
ん幹版NHとFNH.私の参加者との2ndレベルのキャッシュ、一部の設定によりどちらのモを忘れているのに選ばれsqldialect.
初期設定:
var cfg = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(connectionString)
.DefaultSchema("dbo")
.UseReflectionOptimizer()
.Mappings(m => ................);
Guiltyカスタムクエリ:
var sql = @"with Foo(col1,col2,col3)
as (select bla bla bla...)
Select bla bla bla from Foo";
list = Session.CreateSQLQuery(sql)
.AddEntity("fizz", typeof(Fizz))
.SomethingUnimportant();
時を変更したい設定:
var cfg = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(connectionString)
.DefaultSchema("dbo")
.UseReflectionOptimizer()
.Cache(c=>c
.UseQueryCache()
.ProviderClass<HashtableCacheProvider>())
.ShowSql())
.Mappings(m => ................);
クエスローエラーWITH
条項が追加されmssql2008):
クエリは次のように始まり'選択'または'を選択し特有の"
[NotSupportedException:クエリは次のように始まり'選択'または'を選択し異なる'] 設定によりどちらのモ.弁にしてくれる。MsSql2000Dialect.GetAfterSelectInsertPoint(SqlString sql)+179 設定によりどちらのモ.弁にしてくれる。MsSql2000Dialect.GetLimitString(SqlString querySqlString,Int32offset,Int32限)+119 設定によりどちらのモ.弁にしてくれる。MsSql2005Dialect.GetLimitString(SqlString querySqlString,Int32offset,Int32昨)+127 設定によりどちらのモ.ローダを使用します。ローダを使用します。PrepareQueryCommand(QueryParameters queryParameters,BooleanスクロールISessionImplementorセッション)+725 設定によりどちらのモ.ローダを使用します。ローダを使用します。DoQuery(ISessionImplementorセッションでは、QueryParameters queryParameters,Boolean returnProxies)+352 設定によりどちらのモ.ローダを使用します。ローダを使用します。DoQueryAndInitializeNonLazyCollections(ISessionImplementorセッションでは、QueryParameters queryParameters,Boolean returnProxies)+114 設定によりどちらのモ.ローダを使用します。ローダを使用します。DoList(ISessionImplementorセッションでは、QueryParameters queryParameters)+205
そのアイデアに何が混乱設定によりどちらのモ、どこを直せばいいの?
Guilty設定によりどちらのモコード設定によりどちらのモ/弁/MsSql200Dialect.cs):
private static int GetAfterSelectInsertPoint(SqlString sql)
{
if (sql.StartsWithCaseInsensitive("select distinct"))
{
return 15;
}
else if (sql.StartsWithCaseInsensitive("select"))
{
return 6;
}
throw new NotSupportedException
("The query should start with 'SELECT' or 'SELECT DISTINCT'");
}
}
見る .SetMaxResults(123)
原因です。幸いなことに、ジを返します。
も組み合わせが決定されます。
解決
また、同様の行の削除 SetMaxResults
もっ必要なページング)を得ることができるように以下の設定によりどちらのモ構成プロパティがこのバグ:
<property name="use_sql_comments">true</property>
それは確かにバグが GetAfterSelectInsertPoint
方法になることが考慮されているSQLコメントする前に追加されるSQLクエリ。
をセットするだけで、実際に use_sql_comments
財 false
その問題点が消えます。
他のヒント
私は修理のバグを使用Alkampferソリューションが作成した自分のSQL方言ではなく縫製の設定によりどちらのモソースを直接:
public class Sql2008DialectWithBugFixes : MsSql2008Dialect
{
public override SqlString GetLimitString(SqlString querySqlString, int offset, int last)
{
if (offset == 0)
{
return querySqlString.Insert(GetAfterSelectInsertPoint(querySqlString), " top " + last);
}
return base.GetLimitString(querySqlString, offset, last);
}
private static int GetAfterSelectInsertPoint(SqlString sql)
{
Int32 selectPosition;
if ((selectPosition = sql.IndexOfCaseInsensitive("select distinct")) >= 0)
{
return selectPosition + 15; // "select distinct".Length;
}
if ((selectPosition = sql.IndexOfCaseInsensitive("select")) >= 0)
{
return selectPosition + 6; // "select".Length;
}
throw new NotSupportedException("The query should start with 'SELECT' or 'SELECT DISTINCT'");
}
}
だが同じような問題をクエリするとの事です。
残念なことに私のクエリpopulatesグリッド、ページングしていくSetMaxResults.
私の解決のために書き換えを利用派生テーブル:
var sql = @"with Foo(col1,col2,col3)
as (select x1, x2, x3 from x join y blabla)
Select col1, col2, col3 from Foo
join B on B.col1 = Foo.col1";
となり
var sql = @"Select col1, col2, col3 from
(select x1 as col1, x2 as col2, x3 as col3
from x join y blabla) as Foo
join B on B.col1 = Foo.col1";
ける設定によりどちらのモを挿入する側を分かつ"トップx"の文字列の後に""を選択文字列(6文字から始)...コメント:(
T
そうであるとの不思議なバグを日常使用の場所にクエリを挿入するの条項(GetAfterSelectInsertPoint)が語るSandor.きものを直接nh源(実際にパッチを当2.1版を使用しているプロジェクトで この本の詳細は、こちらからご覧).その場所には絶対にニーズをコメントuse_sql_commentsでは以下の操作が可能です。)
またこの場合の問題からのアップグレード1.2 3.2(いの大ジャンプeh?).
の問題に私の場合もあり大手前のスペースを選択算書のhqlなど文字列hql="select"...
とSQL2005方の方言で、この衝突の際には"システム。NotSupportedException:クエリは次のように始まり'を選択し..."というメッセージ.
このセクション
- を単体テストにエラーが発生した場合、チームにとっては、良いテスト駆動開発 を必要とする)
- 削除のスペースから選---"書
- を構築-運用し、単体テスト
とシミュレーションで予想した-unbounding選択が可能回避策.
削除 SetMaxResults
を持って来て作業します。
またこの問題の場合へのアップグレード設定によりどちらのモバージョン3.3では別の理由は---白文字。してくれましたsql文字列をこのように見えます:
var sql = @"
select col1 from MyTable";
または:
var sql = @" select col1 from My Table";
これらの結果、"クエリは次のように始まり'選択'または'を選択し特有の""誤差が設定によりどちらのモなトリムの文字列の前に検証します。
新しい方言とトリムの文字列の最初にこの:
public class Sql2008DialectCustom : MsSql2008Dialect
{
public override SqlString GetLimitString(SqlString queryString, SqlString offset, SqlString limit)
{
var trimmedQueryString = queryString.Trim();
return base.GetLimitString(trimmedQueryString, offset, limit);
}
}