NHibernate与Sql Server Compact Edition和skip / take

时间:2013-07-01 19:53:53

标签: nhibernate sql-server-ce

我正在使用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中尝试时,它不喜欢它。我的程序显然是从数据库中获取所有内容,然后在本地应用分页。显然,这会带来非常糟糕的表现。当我尝试将其作为未来的查询时出现错误,所以我不再这样做了。

作为参考,我的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>();

1 个答案:

答案 0 :(得分:0)

是的,NHibernate确实支持SQL Server CE的分页功能。它的方式是选择正确的方言。

使用标准配置,您必须提供如下设置:

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

流利,应该是:

.Database(MsSqlCeConfiguration.Standard
    .ConnectionString(c => c.FromConnectionStringWithKey("SampleDatabase"))
    ...
    .Dialect("NHibernate.Dialect.MsSqlCe40Dialect")
    ...