2013-07-01 5 views
2

Я использую NHibernate 3.3.3.4000 и SQL Server CE 4.0.8876.1, и я не могу заставить его работать с пейджингом (пропустить и принять). Я вижу противоречивые вещи о поддержке SQL CE.NHibernate с Sql Server Compact Edition и пропустить/принять

Поддерживает ли поддержка драйвера SQL CE от Nhibernate? Сгенерированный SQL не содержит синтаксиса skip/take. Но я вижу, на каком-то блоге синтаксисе, как это:

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

Когда я пытаюсь что в Visual Studio Server Explorer, это не так. Моя программа, по-видимому, извлекает все из базы данных, а затем применяя пейджинг локально. Очевидно, что это дает довольно ужасную производительность. У меня возникла ошибка, когда я попытался сделать это будущим запросом, поэтому я прекратил это делать.

Для справки, мои свободные конфигурации 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 делает функцию поддержки на CE SQL Server для пагинации. То, как это делается, - это выбрать правильный диалект.

Со стандартной конфигурации, вы должны обеспечить настройки, как это:

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

С свободно, оно должно быть как:

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

Это делает добавить Offset х ROWS FETCH NEXT, Y ROWS ТОЛЬКО к моим запросам. Тем не менее, мой запрос все еще занимает очень много времени для выполнения, поэтому происходит что-то еще. –