OData短操作获取输入类型

时间:2019-05-06 07:05:42

标签: c# asp.net

我有一个OData服务。在我的MS.SQLServer的表中,没有主键,并且它具有一个字段,其名称为Id且为smallint。我在OData服务中生成了一个控制器,它具有以下两个get操作:

    // 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“:”在   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在   System.Web.Http.OData.Query.Expressions.FilterBinder.Bind(FilterClause   filterClause,类型filterType,IEdmModel模型,IAssembliesResolver   AssemblyResolver,ODataQuerySettings querySettings)\ r \ n位于   System.Web.Http.OData.Query.FilterQueryOption.ApplyTo(IQueryable   查询,ODataQuerySettings查询设置,IAssembliesResolver   AssemblyResolver)\ r \ n位于   System.Web.Http.OData.Query.ODataQueryOptions.ApplyTo(IQueryable   查询,ODataQuerySettings querySettings)\ r \ n位于   System.Web.Http.OData.EnableQueryAttribute.ApplyQuery(IQueryable   可查询,ODataQueryOptions queryOptions)\ r \ n位于   System.Web.Http.OData.EnableQueryAttribute.ExecuteQuery(Object   响应,HttpRequestMessage请求,HttpActionDescriptor   actionDescriptor)\ r \ n位于   System.Web.Http.OData.EnableQueryAttribute.OnActionExecuted(HttpActionExecutedContext   actionExecutedContext)\ r \ n位于   System.Web.Http.Filters.ActionFilterAttribute.OnActionExecutedAsync(HttpActionExecutedContext   actionExecutedContext,CancellationToken cancellingToken)\ 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上,我无法更改它,以及如何在程序中解决它?

1 个答案:

答案 0 :(得分:0)

您的客户端应用程序很可能没有向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();