加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-web-api – oData $count不能与web api 4中的EntitySetC

发布时间:2020-12-16 04:03:44 所属栏目:asp.Net 来源:网络整理
导读:我正在使用EntitySetController创建一个oData web api控制器,除了获取总记录数之外,一切运行良好. 控制器定义如下: public class MyODataController : EntitySetControllerEntity1,int where TEntity : class{ public override IQueryableEntity1 Get() { r
我正在使用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

我收到错误:
检测到无效操作. ‘$count’不是可以绑定到’Collection([Entity1 Nullable = False])’的动作.

解决方法

不幸的是,虽然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派生的基类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读