我有一个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上,我无法更改它,以及如何在程序中解决它?
答案 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();