OData Paging

Usage:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.OData.Query;

namespace WebApiTest.Controllers
{
    public class ValuesController : ApiController
    {
        private const int PAGESIZE = 25;

        // GET api/values
        [ActionName("Default")]
        public PageOfResults Get(ODataQueryOptions queryOptions)
        {
            var data = new Poco[] { 
                new Poco() { id = 1, name = "one", type = "a" },
                new Poco() { id = 2, name = "two", type = "b" },
                new Poco() { id = 3, name = "three", type = "c" },
                new Poco() { id = 4, name = "four", type = "d" },
                new Poco() { id = 5, name = "five", type = "e" },
                new Poco() { id = 6, name = "six", type = "f" },
                new Poco() { id = 7, name = "seven", type = "g" },
                new Poco() { id = 8, name = "eight", type = "h" },
                new Poco() { id = 9, name = "nine", type = "i" }
            };

            var t = new ODataValidationSettings() { MaxTop = PAGESIZE };
            queryOptions.Validate(t);
            var s = new ODataQuerySettings() { PageSize = PAGESIZE };
            IEnumerable results = 
                (IEnumerable)queryOptions.ApplyTo(data.AsQueryable(), s);

            int skip = queryOptions.Skip == null ? 0 : queryOptions.Skip.Value;
            int take = queryOptions.Top == null ? PAGESIZE : queryOptions.Top.Value;
            long count = Request.GetInlineCount() ?? 0;

            PageOfResults page =
                new PageOfResults(results, skip, take, count);

            return page;
        }
    }
}

Class:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Serialization;

namespace WebApiTest
{
    [Serializable]
    [XmlRoot("Page")]
    public class PageOfResults<T>
    {
        public PageOfResults() { }
        private readonly IEnumerable<T> _results;
        private long _skip;
        private long _take;
        private long _total;
        public PageOfResults(IEnumerable<T> items, int skip, int take, long total)
        {
            _results = items;//.ToList();
            _skip = skip;
            _take = take;
            _total = total;
        }

        [XmlAttribute("skip")]
        public long Skip
        {
            get { return _skip; }
            set { }
        }

        [XmlAttribute("top")]
        public long Top
        {
            get { return _take; }
            set { }
        }

        [XmlAttribute("total")]
        public long Total
        {
            get { return _total; }
            set { }
        }

        [XmlArray("Results")]
        public List<T> Items
        {
            get
            {
                return _results.ToList();
            }
        }
    }
}