asp.net-web-api – oData $count不能与web api 4中的EntitySetControl
发布时间:2020-05-28 17:52:16 所属栏目:asp.Net 来源:互联网
导读:我正在使用EntitySetController创建一个oData web api控制器,除了获取总记录数之外,一切运行良好. 控制器定义如下: public class MyODataController : EntitySetControllerEntity1, int where TEntity : class{ public override IQueryableEntit
|
我正在使用EntitySetController创建一个oData web api控制器,除了获取总记录数之外,一切运行良好. 控制器定义如下: public class MyODataController : EntitySetController<Entity1,int> where TEntity : class
{
public override IQueryable<Entity1> Get()
{
return EntityDatabase.Get();
}
}
当我打电话给我时: http://localhost:44789/oData/MyOData/$count 我收到错误: 解决方法不幸的是,虽然Web API在未来的版本中应该是开箱即用,但它并不支持$count开箱即用.在此期间,您仍然可以通过定义这些类来添加支持:public class CountODataRoutingConvention : EntitySetRoutingConvention
{
public override string SelectAction(ODataPath odataPath,HttpControllerContext controllerContext,ILookup<string,HttpActionDescriptor> actionMap)
{
if (controllerContext.Request.Method == HttpMethod.Get && odataPath.PathTemplate == "~/entityset/$count")
{
if (actionMap.Contains("GetCount"))
{
return "GetCount";
}
}
return null;
}
}
public class CountODataPathHandler : DefaultODataPathHandler
{
protected override ODataPathSegment ParseAtEntityCollection(IEdmModel model,ODataPathSegment previous,IEdmType previousEdmType,string segment)
{
if (segment == "$count")
{
return new CountPathSegment();
}
return base.ParseAtEntityCollection(model,previous,previousEdmType,segment);
}
}
public class CountPathSegment : ODataPathSegment
{
public override string SegmentKind
{
get
{
return "$count";
}
}
public override IEdmType GetEdmType(IEdmType previousEdmType)
{
return EdmCoreModel.Instance.FindDeclaredType("Edm.Int32");
}
public override IEdmEntitySet GetEntitySet(IEdmEntitySet previousEntitySet)
{
return previousEntitySet;
}
public override string ToString()
{
return "$count";
}
}
在MapODataRoute中注册它们: IList<IODataRoutingConvention> routingConventions = ODataRoutingConventions.CreateDefault();
routingConventions.Insert(0,new CountODataRoutingConvention());
config.Routes.MapODataRoute("OData","odata",GetModel(),new CountODataPathHandler(),routingConventions);
在您的控制器中,添加此方法: public HttpResponseMessage GetCount(ODataQueryOptions<TEntity> queryOptions)
{
IQueryable<TEntity> queryResults = queryOptions.ApplyTo(Get()) as IQueryable<TEntity>;
int count = queryResults.Count();
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StringContent(count.ToString(),Encoding.UTF8,"text/plain");
return response;
}
为了避免将GetCount()复制到每个控制器,您可以定义一个从定义GetCount的EntitySetController派生的基类. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – 包中的文件排序 – 已知的库是什么?
- asp.net-mvc – 如何使用MVC 4上传大文件?
- asp.net – 如何使用资源文件设置按钮文本
- asp.net-mvc – Azure git部署 – 第二个程序集中缺少引用
- asp.net-mvc-3 – ASP.NET MVC 3 – 验证问题
- asp.net – 如何阻止.net中的libwww-perl访问?
- 在asp.net中使用eval(“”)
- asp.net – 了解runat服务器属性
- asp.net-mvc – ASP.Net MVC如何确定用户是否可以访问一个U
- asp.net-mvc-5 – 在@Html.AntiForgery发送HTTP标头后,服务
推荐文章
站长推荐
- 基于声明的身份 – 在asp.net MVC5 EF6中使用流畅
- asp.net – ASP核心:如何设置httpContext.User?
- ASP.NET调试与IIS超时
- asp.net-mvc-3 – ASP.NET MVC 3:当BeginForm在
- asp.net-mvc – 在部署MVC 2 Web应用程序时要绝对
- asp.net-mvc – MVC.net获取枚举显示名称而不必参
- asp.net-mvc-3 – ASP.NET MVC 3和Razor的ASHX处
- asp.net – 谁负责处理HttpPostedFile.InputStre
- asp.net – 如何使用ajax调用跨域web api?
- asp.net-mvc – Visual Studio 2010 Web发布缺少
热点阅读
