【问题标题】:OData Action Get for Short input type短输入类型的 OData 操作获取
【发布时间】:2019-05-06 07:05:42
【问题描述】:

我有一个 OData 服务。在我的 MS.SQLServer 的表中,没有主键,它有一个名称为 Id 且为 smallint 的字段。我在我的 OData 服务中生成了一个控制器,它有两个获取操作,如下所示:

    // GET: odata/BankAccs
    [Queryable]
    public IQueryable<BankAcc> Get()
    {
        return db.BankAcc;
    }

    // GET: odata/BankAccs(5)
    [Queryable]
    public SingleResult<BankAcc> Get([FromODataUri] short key)
    {
        return SingleResult.Create(db.BankAcc.Where(bankAcc => bankAcc.Id 
           == key));
    }

我在客户端安装了 OData v4 客户端代码生成器来调用此服务。我使用以下代码调用服务:

    var bankAccs = container.BankAccs.Where(n => n.Id == 312).Select(x => 
                                      x).ToList();
    var bankAcc = bankAccs.Select(x => x.No).ToList();
    Console.WriteLine(bankAcc[0]);

当我运行我的客户端时,我会遇到以下错误:

Microsoft.OData.Client.DataServiceQueryException: '发生错误 在处理这个请求时。'

内部异常DataServiceClientException: {"error":{"code":"","message":"一个错误有 发生。","innererror":{"message":"未知函数 'cast'.","type":"System.NotImplementedException","stacktrace":" at System.Web.Http.OData.Query.Expressions.FilterBinder.BindSingleValueFunctionCallNode(SingleValueFunctionCallNode 节点)\r\n 在 System.Web.Http.OData.Query.Expressions.FilterBinder.Bind(QueryNode 节点)\r\n 在 System.Web.Http.OData.Query.Expressions.FilterBinder.BindBinaryOperatorNode(BinaryOperatorNode binaryOperatorNode)\r\n 在 System.Web.Http.OData.Query.Expressions.FilterBinder.Bind(QueryNode 节点)\r\n 在 System.Web.Http.OData.Query.Expressions.FilterBinder.BindExpression(SingleValueNode 表达式,RangeVariable rangeVariable,类型 elementType)\r\n at System.Web.Http.OData.Query.Expressions.FilterBinder.Bind(FilterClause filterClause,类型 filterType,IEdmModel 模型,IAssembliesResolver 程序集解析器、ODataQuerySettings 查询设置)\r\n 在 System.Web.Http.OData.Query.FilterQueryOption.ApplyTo(IQueryable 查询、ODataQuerySettings 查询设置、IAssembliesResolver 程序集解析器)\r\n 在 System.Web.Http.OData.Query.ODataQueryOptions.ApplyTo(IQueryable 查询,ODataQuerySettings querySettings)\r\n at System.Web.Http.OData.EnableQueryAttribute.ApplyQuery(IQueryable 可查询,ODataQueryOptions queryOptions)\r\n at System.Web.Http.OData.EnableQueryAttribute.ExecuteQuery(对象 响应,HttpRequestMessage 请求,HttpActionDescriptor actionDescriptor)\r\n 在 System.Web.Http.OData.EnableQueryAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)\r\n 在 System.Web.Http.Filters.ActionFilterAttribute.OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancelToken)\r\n--- 结束 来自先前抛出异常的位置的堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)\r\n 在 System.Web.Http.Filters.ActionFilterAttribute.d__6.MoveNext()\r\n--- 从先前抛出异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)\r\n 在 System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext()\r\n--- 从先前抛出异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)\r\n 在 System.Web.Http.Controllers.ActionFilterResult.d__5.MoveNext()\r\n--- 从先前抛出异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)\r\n 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__15.MoveNext()"}}}

我知道问题出在我的数据库中的这个 smallint 上,我无法更改它,如何在我的程序中解决它???

【问题讨论】:

  • SQL Server smallint 类型相当于.net Int16 和c# short。属性BankAcc.Id 是如何声明的?是 Int16/short 还是其他类型?
  • 是的,它正好是 Int16 并且很短。正如您在第二个 Get 动作的输入中看到的那样,脚手架制作是“短”的
  • 我搜了一下,在地址里找到了答案 ===>> (forums.asp.net/t/1973366.aspx?odata+unknown+function+cast) 在这个地址里说我必须写 (var bankAccs = container.BankAccs.Where(n => n .Id..Equals(312)).Select(x => x).ToList();) 而不是 (var bankAccs = container.BankAccs.Where(n => n.Id == 312).Select(x = > x).ToList();) 在我的客户端应用程序中。
  • 考虑回答你自己的问题,这不仅被允许而且被鼓励。
  • 谢谢。它解决了我的问题。你有更好的主意吗??

标签: c# asp.net


【解决方案1】:

您的客户端应用程序很可能没有向 OData 层提供 short 而是 int,从而引发错误。

您可以使用以下方法查询数据:

var bankAccs = container.BankAccs.Where(n => n.Id..Equals(312)).Select(x => x).ToList();

代替:

var bankAccs = container.BankAccs.Where(n => n.Id == 312).Select(x => x).ToList();

该信息的来源:odata unknown function cast

我会尝试明确避免错误的类型:

short bankId = 312;
var bankAccs = container.BankAccs.Where(n => n.Id == (short)bankId).Select(x => x).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2013-10-09
    • 2017-02-27
    相关资源
    最近更新 更多