Я использую 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>();
Это делает добавить Offset х ROWS FETCH NEXT, Y ROWS ТОЛЬКО к моим запросам. Тем не менее, мой запрос все еще занимает очень много времени для выполнения, поэтому происходит что-то еще. –