C# 使用XmlSerializer的OData分页

C# 使用XmlSerializer的OData分页,c#,asp.net-web-api,odata,C#,Asp.net Web Api,Odata,我已经使用ODataQueryOptions和PageResult类成功地使用WebApi.OData(v4.0.0)实现了$inlinecount,如下所示: 波科 控制器 [ActionName("Default")] public PageResult<Poco> Get(ODataQueryOptions<Poco> queryOptions) { var data = new Poco[] { new Poco() { id = 1,

我已经使用
ODataQueryOptions
PageResult
类成功地使用WebApi.OData(v4.0.0)实现了
$inlinecount
,如下所示:

波科

控制器

[ActionName("Default")]
public PageResult<Poco> Get(ODataQueryOptions<Poco> 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 = 2 };
    queryOptions.Validate(t);
    var s = new ODataQuerySettings() { PageSize = 1 };
    IQueryable results = queryOptions.ApplyTo(data.AsQueryable(), s);

    var next = Request.GetNextPageLink();
    var count = Request.GetInlineCount();

    return new System.Web.Http.OData.PageResult<Poco>(
        results as IEnumerable<Poco>, next, count);
}

PageResult
无法由
XmlSerializer
序列化,因为它没有公共的无参数构造函数。但是,没有什么可以阻止您定义自己的类似类型,该类型具有公共的、无参数的构造函数。这应该很简单。我建议您查看一下
PageResult
的源代码,并采用类似的方法

[ActionName("Default")]
public PageResult<Poco> Get(ODataQueryOptions<Poco> 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 = 2 };
    queryOptions.Validate(t);
    var s = new ODataQuerySettings() { PageSize = 1 };
    IQueryable results = queryOptions.ApplyTo(data.AsQueryable(), s);

    var next = Request.GetNextPageLink();
    var count = Request.GetInlineCount();

    return new System.Web.Http.OData.PageResult<Poco>(
        results as IEnumerable<Poco>, next, count);
}
var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter;
xml.UseXmlSerializer = true;
GlobalConfiguration.Configuration.Formatters.Remove(
    GlobalConfiguration.Configuration.Formatters.JsonFormatter);