验证以下几条:
1. PageResult,ODataQueryOptions,ODataQuerySettings的命名空间是 System.Web.OData下的, 不是System.Web.Http.OData;
2. 方法不要添加EnableQuery特性;
3. 项目启动时要添加以下配置:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.OData.Extensions;
namespace LMSAPIExtend.App_Start
{
public static class ODataConfig
{
public static void Configure(HttpConfiguration config)
{
config.Count().Filter().OrderBy().Expand().Select().MaxTop(null);
config.EnableDependencyInjection();
config.AddODataQueryFilter();
}
}
}
在WebApiConfig.cs里调用初始设置:
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace LMSAPIExtend
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
JSONConfig.Configure(config);
ODataConfig.Configure(config);
}
}
}
以下是get的例子:
/// <summary>
/// 请求翻页举例(skip是跳过几条数据):http://localhost:16865/api/Courses?$inlinecount=allpages&$skip=40
/// 查询名称中包含27testuploadCourse的Course: http://localhost:16865/api/Courses/GetPublishedAndNotDeletedCourses?&$skip=0&$filter=substringof('testuploadCourse',CourseTitle);
/// 按照CourseItitle排序: http://localhost:16865/api/Courses/GetPublishedAndNotDeletedCourses?&$skip=0&$orderby=CourseTitle desc(升序的话,不加desc)
/// </summary>
/// <returns></returns>
// GET: api/Courses
//[EnableQuery(PageSize = 10, MaxTop = 100, MaxSkip = 200)]
public PageResult<Course> GetPublishedAndNotDeletedCourses(ODataQueryOptions<Course> options)
{
var tempQuery = db.Courses.Where(t => t.IsPublished == true && t.IsDeleted == false).AsQueryable();
ODataQuerySettings settings = new ODataQuerySettings()
{
PageSize = 10
};
IQueryable results = options.ApplyTo(tempQuery, settings);
return new PageResult<Course>(
results as IEnumerable<Course>,
Request.ODataProperties().NextLink,
Request.ODataProperties().TotalCount
);
//return tempQuery;
}