odata自定义函数参数的短数据类型(Edm.Int16)

时间:2015-04-18 04:41:17

标签: c# asp.net asp.net-web-api odata

我在EdmModel中声明了一个自定义函数:

var getWebMenu = builder.Function("GetWebMenu");
getWebMenu.Parameter<Guid>("SiteId");
getWebMenu.Parameter<Guid>("LanguageId");
getWebMenu.Parameter<string>("MenuName");
getWebMenu.Parameter<int>("MenuIndex");

当我通过HTTP调用它时,它工作得很好。但是,MenuInde​​x的基础数据类型为shortint16),当我将代码转换回short

getWebMenu.Parameter<short>("MenuIndex");

(显然,通过我的代码更改的流量)HTTP调用失败并带有404.0 - Not found

在这两种情况下,HTTP调用都是这样的:

http://localhost:19215/GetWebMenu(SiteId=ac2453bd-f2dd-e411-8159-984be10349a2,
    LanguageId=ac2453bd-f2dd-e411-8159-984be10349a2,
    MenuName='Main Menu',MenuIndex=0)?$expand=webMenuItems

当参数被声明为http://localhost:19215/$metadata时,short看起来很好:

<Function Name="GetWebMenu">
    <Parameter Name="SiteId" Type="Edm.Guid" Nullable="false"/>
    <Parameter Name="LanguageId" Type="Edm.Guid" Nullable="false"/>
    <Parameter Name="MenuName" Type="Edm.String" Unicode="false"/>
    <Parameter Name="MenuIndex" Type="Edm.Int16" Nullable="false"/>
    <ReturnType Type="data.models.WebMenu"/>
</Function>

更多信息

在写这个问题的时候,我已经仔细检查了几件事,我发现我的假设很明显&#34;通过我的代码改变的流程似乎至少让我感到厌烦。 失败时,Controller函数签名如下所示:

[ODataRoute("GetWebMenu(SiteId={siteId}, LanguageId={languageId}, MenuName={menuName},
    MenuIndex={menuIndex})")]
[SingleResultEnableQuery]
public SingleResult<WebMenu> GetWebMenu([FromODataUri] Guid siteId, 
    [FromODataUri] Guid languageId, [FromODataUri] string menuName, 
    [FromODataUri] short menuIndex) 

请参阅short的{​​{1}}数据类型?当我将menuIndex数据类型更改为int时,我将其更改为getWebMenu.Parameter<short>("MenuIndex");,反之亦然。

回答吗 然而;如果我将int保留为getWebMenu.Parameter<int>("MenuIndex");并将其余代码保留为int,那么HTTP调用就可以正常工作。

问题! 由于Edm.Int16是受支持的类型,我希望我的用户知道Edm.Int16是必需的,请有人告诉我如何在EdmModel上的自定义函数声明中声明short

1 个答案:

答案 0 :(得分:0)

我们的工程师在ODataLib中确认为URL解析器中的错误,并为其创建了一个GitHub问题:https://github.com/OData/odata.net/issues/154。请使用它监控修复状态。