gpt4 book ai didi

asp.net-web-api - oData $count 不适用于 Web api 4 中的 EntitySetController

转载 作者:行者123 更新时间:2023-12-02 03:31:00 25 4
gpt4 key购买 nike

我正在使用 EntitySetController 创建一个 oData Web API Controller ,除了获取总记录数之外,一切正常。

Controller 定义如下:

public class MyODataController : EntitySetController<Entity1, int> where TEntity : class
{
public override IQueryable<Entity1> Get()
{
return EntityDatabase.Get();
}
}

当我通过以下方式调用计数时:

http://localhost:44789/oData/MyOData/$count

我收到错误:检测到无效操作。 “$count”不是可以绑定(bind)到“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);

并在您的 Controller 中添加此方法:

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() 复制到每个 Controller ,您可以定义一个从定义 GetCount 的 EntitySetController 派生的基类。

关于asp.net-web-api - oData $count 不适用于 Web api 4 中的 EntitySetController<TEntity, TKey>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16649760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com