【发布时间】: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类型相当于.netInt16和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();) 在我的客户端应用程序中。
-
考虑回答你自己的问题,这不仅被允许而且被鼓励。
-
谢谢。它解决了我的问题。你有更好的主意吗??