Telerik ToDataSourceResult方法导致oData数据服务查询中出现NotSupportedException
我有一个连接到此控制器的Telerik数据网格(它执行对Microsoft Dynamics 365云服务的oData查询)Telerik ToDataSourceResult方法导致oData数据服务查询中出现NotSupportedException,odata,telerik-grid,telerik-mvc,Odata,Telerik Grid,Telerik Mvc,我有一个连接到此控制器的Telerik数据网格(它执行对Microsoft Dynamics 365云服务的oData查询) [路线(“订单”)] 公共操作结果命令([DataSourceRequest]DataSourceRequest请求) { var context=_dynamicContextFactory.CreateContext(); var orderHeaders=context.SalesOrderHeadersV2//TODO:用于用户会话的筛选器//。其中(x=>x.O
[路线(“订单”)]
公共操作结果命令([DataSourceRequest]DataSourceRequest请求)
{
var context=_dynamicContextFactory.CreateContext();
var orderHeaders=context.SalesOrderHeadersV2//TODO:用于用户会话的筛选器//。其中(x=>x.OrderingCustomerAccountNumber==“DE-001”)
.选择(
x=>neworderheader()
{
SalesOrderNumber=x.SalesOrderNumber,
OrderTotalAmount=x.OrderTotalAmount,
SalesOrderOriginCode=x.SalesOrderOriginCode,
CustomerTransactionSettlementType=x.CustomerTransactionSettlementType,
OrderCreationDateTime=x.OrderCreationDateTime,
ConfirmedShippingDate=x.ConfirmedShippingDate,
});
//这种方式不适用于执行分页等操作的ToDataSourceResult。
//x=>x.AutoMap());
返回Json(orderHeaders.ToDataSourceResult(请求));
}
分页工作正常,但当我尝试分组或排序时,会出现以下异常:
无法在选择查询选项之后指定orderby查询选项
看起来我需要重新排序DataServiceQuery是如何构造的,但我不知道如何构造。
(如果我使我的API符合oData规范并使用它,会有帮助吗?或者只是将相同的问题转移到其他地方。)
额外信息:我希望automapper也能正常工作,我希望根本原因是类似的。
以下是我的看法:
@(Html.Kendo().Grid<MyAccountApiController.OrderHeader>()
.Deferred()
.Name("grid")
.Columns(columns =>
{
columns.Bound(x => x.SalesOrderNumber);
columns.Bound(x => x.CustomerTransactionSettlementType);
columns.Bound(x => x.ConfirmedShippingDate);
columns.Bound(x => x.OrderCreationDateTime);
columns.Bound(x => x.OrderTotalAmount);
columns.Bound(x => x.SalesOrderOriginCode);
})
.HtmlAttributes(new { style = "height: 400px;" })
.Scrollable()
.Groupable()
.Sortable()
.Pageable(page =>
page
.Refresh(true)
.PageSizes(true)
.ButtonCount(5)
)
.DataSource(source =>
source
.Ajax()
.Read(read => read.Action("Orders", "MyAccountApi")
)
.PageSize(20)
))
@(Html.Kendo().Grid())
.递延
.名称(“网格”)
.列(列=>
{
columns.Bound(x=>x.SalesOrderNumber);
columns.Bound(x=>x.CustomerTransactionSettlementType);
columns.Bound(x=>x.ConfirmedShippingDate);
columns.Bound(x=>x.OrderCreationDateTime);
columns.Bound(x=>x.OrderTotalAmount);
columns.Bound(x=>x.SalesOrderOriginCode);
})
.HtmlAttributes(新的{style=“height:400px;”})
.Scrollable()
.Groupable()
.Sortable()
.Pageable(第=>
页
.刷新(真)
.页面大小(真)
.按钮计数(5)
)
.DataSource(source=>
来源
.Ajax()
.Read(Read=>Read.Action(“订单”、“MyAccountApi”)
)
.页面大小(20)
))
注意:以下答案可行,但效果不好,因为它不会将投影推送到动态,因此会下载大量数据。
我偶然发现了答案:
[Route("orders")]
public ActionResult Orders([DataSourceRequest] DataSourceRequest request)
{
var context = _dynamicsContextFactory.CreateContext();
var orderHeaders = context.SalesOrderHeadersV2;
return Json(orderHeaders.ToDataSourceResult(request, x => new OrderHeader()
{
OrderCreationDateTime = x.OrderCreationDateTime.DateTime,
SalesOrderNumber = x.SalesOrderNumber,
CustomerRequisitionNumber = x.CustomerRequisitionNumber,
SalesOrderStatus = x.SalesOrderStatus,
DeliveryAddressLocationId = x.DeliveryAddressLocationId,
ContactPersonId = x.ContactPersonId,
OrderTotalAmount = x.OrderTotalAmount,
}));
}
或者使用automapper
[Route("orders")]
public ActionResult Orders([DataSourceRequest] DataSourceRequest request)
{
var context = _dynamicsContextFactory.CreateContext();
var orderHeaders = context.SalesOrderHeadersV2;
return Json(orderHeaders.ToDataSourceResult(request, x => x.AutoMap<OrderHeader>()));
}
[路线(“订单”)]
公共操作结果命令([DataSourceRequest]DataSourceRequest请求)
{
var context=_dynamicContextFactory.CreateContext();
var orderHeaders=context.salesforderheadersv2;
返回Json(orderHeaders.ToDataSourceResult(请求,x=>x.AutoMap());
}
[Route("orders")]
public ActionResult Orders([DataSourceRequest] DataSourceRequest request)
{
var context = _dynamicsContextFactory.CreateContext();
var orderHeaders = context.SalesOrderHeadersV2;
return Json(orderHeaders.ToDataSourceResult(request, x => x.AutoMap<OrderHeader>()));
}