我正在使用 NHibernate 3.3.3.4000 和 SQL Server CE 4.0.8876.1,但我无法让它与分页一起使用(跳过并获取)。我看到有关 SQL CE 对它的支持的矛盾之处。
Nhibernate 的 SQL CE 驱动是否支持skip and take?生成的 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>();