Imagine, you have to implement batching for a time consuming operation using NHibernate. I would write it like this:
But what I found is that if the DuStuff is time consuming then it is possible to have duplicated items from the query. Thatis because of NHibernate generated query:
That order by CURRENT_TIMESTAMP... If you want consistent results you would have to apply specific ordering:
var items = new List<Item>(); for (var page = 0; page == 0 || items.Any(); page++) { items = GetListOfItems(page); foreach (var items in items) { DoStuff(item); } } public void GetListOfItems(int page) { return CurrentSession.QueryOver<Item>() .Select(Projections.Id()) .Take(PageSize) .Skip(PageSize * page) .List(); }
But what I found is that if the DuStuff is time consuming then it is possible to have duplicated items from the query. Thatis because of NHibernate generated query:
SELECT TOP (@p0) y0_ FROM ( SELECT this_.Id AS y0_ ,ROW_NUMBER() OVER ( ORDER BY CURRENT_TIMESTAMP ) AS __hibernate_sort_row FROM contact.sfContact this_ ) AS query WHERE query.__hibernate_sort_row > @p1 ORDER BY query.__hibernate_sort_row;
That order by CURRENT_TIMESTAMP... If you want consistent results you would have to apply specific ordering:
public void GetListOfItems(int page) { return CurrentSession.QueryOver<Item>() .Select(Projections.Id()) .OrderBy(i => i.Id).Asc .Take(PageSize) .Skip(PageSize * page) .List(); }
No comments:
Post a Comment