特定のページから特定の数の要素を返す必要がある単純なLINQ-to-Entitiesクエリがあります。リクエストの例は次のとおりです。
var query = from r in records
orderby r.createdDate descending
select new MyObject()
{ ... };
//Parameters: pageId = 8, countPerPage = 10
List<MyObject> list = query.Skip(pageId * countPerPage).Take(countPerPage);
上記の例はほとんどの場合にうまく機能しますが、リストに10を超える要素が含まれる場合もあります。これは常に正しいとは限らず、データベースデータに依存します。たとえば、ページ10をリクエストし、countPerPageを10として渡すと、10個の要素が取得されます。しかし、ページ12を要求し、countPerPageを10として渡すと、11個の要素が取得されます。次に、21ページを要求すると、10個の要素が再び取得されます。
それが起こる理由はありますか?
更新:確かに、クエリは例のように単純ではなく、サブクエリが含まれています。
そして、これがより完全な例です:
var elementsQuery = from m in entityContext.elements
where m.elementSearchText.Contains(filter)
orderby m.CreatedDate descending
select new DataContracts.ElementForWeb()
{
FirstName = m.FirstName,
LastName = m.LastName,
Photos = (from p in m.Photos select p.ID),
PlacesCount = m.Childs.Where(x => x.Place != null).Count() + ((m.MainChild != null)?1:0),
SubElements = (
from t in m.Childs
orderby t.CreatedDate descending
select new DataContracts.ChildForWeb()
{
CommentsCount = t.ChildComments.Count,
Photos = (from p in t.Photos select p.ID),
Comments = (from c in t.ChildComments
orderby c.CreatedDate descending
select new DataContracts.CommentForWeb()
{
CommentId = c.ID,
CommentText = c.CommentText,
CreatedByPhotoId = c.Account.UserPhoto,
CreatedDate = c.CreatedDate,
}).Take(5)
}).Take(5)
};
List<DataContracts.ElementForWeb> elements =
new List<DataContracts.ElementForWeb>(
elementsQuery
.Skip(pageId * countPerPage)
.Take(countPerPage));
UPDATE2:これはさらに興味深いテストです。
for (var i = 0; i < 10; i++) {
Service.GetElementsForWebPaged(12, 10, "",
function (result) {
console.log("Elements returned: " + result.length);
},
function (error) {
});
}
結果は「素晴らしい」です!
Elements returned: 11
Elements returned: 11
Elements returned: 10
Elements returned: 11
Elements returned: 11
Elements returned: 10
Elements returned: 11
Elements returned: 10
Elements returned: 11
Elements returned: 11