2

NHibernate 3.3.3.4000 と SQL Server CE 4.0.8876.1 を使用していますが、ページング (スキップ アンド テイク) で動作させることができません。SQL CE のサポートについて、矛盾しているように見えます。

Nhibernate の SQL CE ドライバーはスキップとテイクをサポートしていますか? 生成された SQL には、skip/take 構文は含まれません。しかし、私は次のようないくつかのブログ構文を見ます:

SELECT * FROM Orders
ORDER BY OrderID
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY;

Visual Studio Server Explorer でそれを試してみると、それは気に入りません。私のプログラムは明らかにデータベースからすべてを取得し、ページングをローカルに適用しています。明らかに、それはかなりひどいパフォーマンスをもたらします。futureクエリにしようとしたらエラーが出たのでやめました。

参考までに、私のFluent NHibernateの構成は

    var cfg = Fluently.Configure()
    .Database(MsSqlCeConfiguration.Standard
        .ConnectionString(c => c.FromConnectionStringWithKey("SampleDatabase"))
        .AdoNetBatchSize(500)
        .FormatSql())
    .Mappings(mappings => mappings.FluentMappings.AddFromAssemblyOf<PositionMapping>())
    .Cache(c => c.ProviderClass<SysCacheProvider>())
    .BuildConfiguration();

そして私の質問は

var baseQuery = session.QueryOver<Position>();
var countQuery = baseQuery.ToRowCountQuery().FutureValue<int>();
items = baseQuery
.Left.JoinAlias(p => p.PublicText, () => publicTextAlias)
.Left.JoinAlias(p => p.RegisteredText, () => registeredTextAlias)
.Fetch(p => p.Term).Eager
.Fetch(p => p.Tags).Eager
.OrderBy(p => p.OpenDate).Desc
.CacheMode(NHibernate.CacheMode.Ignore)
.Skip(skip).Take(BatchSize)
//.Future(); // Causes error
.List<Position>();
4

1 に答える 1

0

はい、NHibernate は、ページネーションのために SQL Server CE の機能をサポートしています。その方法は、正しい方言を選択することです。

標準構成では、次のような設定を提供する必要があります。

<property name="dialect">NHibernate.Dialect.MsSqlCe40Dialect</property>

流暢では、次のようになります。

.Database(MsSqlCeConfiguration.Standard
    .ConnectionString(c => c.FromConnectionStringWithKey("SampleDatabase"))
    ...
    .Dialect("NHibernate.Dialect.MsSqlCe40Dialect")
    ...  
于 2013-07-02T03:27:31.303 に答える