2013-07-01 35 views
2

我使用NHibernate的3.3.3.4000和SQL Server CE 4.0.8876.1,我不能讓它與分頁(跳過和採取)的工作。我看到SQL CE對它的支持有矛盾的地方。NHibernate的Sql Server精簡版和跳過/採取

Nhibernate的SQL CE驅動程序是否支持跳過和取出?生成的SQL不包含任何skip/take語法。但我看到這樣的博客語法:

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

當我嘗試在Visual Studio服務器資源管理器中,它不喜歡那樣。我的程序顯然是從數據庫中獲取所有內容,然後在本地應用分頁。顯然這給了非常糟糕的表現。當我試圖使它成爲未來的查詢時,我得到了一個錯誤,所以我停止了這樣做。

僅供參考,我的功能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>(); 

回答

0

是NHibernate的做了分頁的SQL Server CE的支持功能。它的做法是選擇正確的方言。

標準配置,你必須提供的設置是這樣的:

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

用流利的,它應該是這樣的:

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

這並添加OFFSET X行FETCH NEXT y行只對我的查詢。但是,我的查詢仍然需要很長時間才能執行,所以還有其他事情正在進行。 –