gpt4 book ai didi

.net - WebApi OData 实体集/键/导航/键支持

转载 作者:行者123 更新时间:2023-12-04 19:10:09 25 4
gpt4 key购买 nike

我正在考虑在 WebApi 中使用 odata。到目前为止一切顺利,我喜欢它比 wcf 数据服务更灵活。

但是,当我尝试在模型中使用虚拟 IQueryable 属性时,我遇到了问题。

例如,我有这些模型类:

public class MainItem
{
public int Id { get; set;}
public virtual IEnumerable<SubItem> SubItems { get; set;}
}

我的 MainItemsController 看起来像这样
public class MainItemsController : EntitySetController<MainItem, int>
{
[Queryable]
public override IQueryable<MainItem> Get()
{
return SomeMainItemIQueryable();
}

public override GetEntityByKey(int key)
{
return SingleMainItem(key);
}

[Queryable]
public IQueryable GetSubItems(int key)
{
return SomeSubItemIQueryable(SingleMainItem(key));
}
}

我在以下网址上得到了正确的结果:
/odata/主要项目
/odata/MainItems(1)
/odata/MainItems(1)/SubItems

但是当我尝试做
/odata/MainItems(1)/SubItems(1)

我收到这个错误
此服务不支持“~/entityset/key/navigation/key”形式的 OData 请求

我很想将这个调用和/odata/MainItems(1)/SubItems 重定向到 SubItemsController。

我可能可以通过制作自定义 ODataPathHandler 来做到这一点,但这并不是正确的做法。

最佳答案

这是正确的。您不需要自定义路径处理程序。它代表我们理解的有效 OData URL,并且可以将其解析为 ODataPath .您需要的是自定义路由约定。路由约定将 ODataPath 映射到 Controller 和操作。默认情况下,我们仅提供处理 WCF DS 客户端生成的 url 的基本路由约定。看起来您正在使用我们没有路由约定的 URL。虽然写一个很简单。例子,

public class ContainmentRoutingConvention : IODataRoutingConvention
{
public string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
{
IEdmEntitySet entitySet = odataPath.EntitySet;

if (odataPath.PathTemplate == "~/entityset/key/navigation")
{
controllerContext.RouteData.Values["key"] = (odataPath.Segments[1] as KeyValuePathSegment).Value;
return "Get" + entitySet.Name;
}
else if (odataPath.PathTemplate == "~/entityset/key/navigation/key")
{
controllerContext.RouteData.Values["key1"] = (odataPath.Segments[1] as KeyValuePathSegment).Value;
controllerContext.RouteData.Values["key2"] = (odataPath.Segments[3] as KeyValuePathSegment).Value;
return "Get" + entitySet.ElementType.Name;
}

return null;
}

public string SelectController(ODataPath odataPath, HttpRequestMessage request)
{
if (odataPath.PathTemplate == "~/entityset/key/navigation" ||
odataPath.PathTemplate == "~/entityset/key/navigation/key")
{
IEdmNavigationProperty navigationProperty = (odataPath.Segments[2] as NavigationPathSegment).NavigationProperty;
IEdmEntitySet entitySet = odataPath.EntitySet; // the target entity set, which would be 'SubItems';

return entitySet.Name;
}

return null;
}
}

这只会处理您提到的两个网址。它也应该很容易扩展以支持其他 url。

处理 ~/entityset/key/navigation 的操作的签名将是 IEnumerable<Order> GetOrders(int key)对于 url ~/entityset/key/navigation/key,它将是 Order GetOrder(int key1, int key2) .

关于.net - WebApi OData 实体集/键/导航/键支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15702843/

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