Im using 3 tier.
1 presenter
2 service (webapi & service business logic layer)
3 data access
this is my presenter code
@(Html.Kendo().Grid<ParkingRevenueViewModel>() .Name("grid") .Columns(columns => { columns.Bound(p => p.ParkDate).Width(20).Title("Date").Format("{0:dd/MM/yyyy}").Filterable(true); columns.Bound(p => p.VehRegNbr).Width(100).Title("Vehicle No"); columns.Bound(p => p.RoadName).Width(150).Title("Road").Filterable(false); columns.Bound(p => p.LotNo).Width(50).Title("Lot No"); columns.Bound(p => p.StartTime).Width(100).Title("Parking Time").Format("{0:dd/MM/yyyy h:mm:ss tt}").Filterable(false); columns.Bound(p => p.Value).Width(50).Title("Value").Filterable(false); }) .Filterable() .Pageable() .DataSource(dataSource => dataSource .WebApi() .Aggregates(aggregates => { aggregates.Add(p => p.Value).Sum(); }) .Events(events => events.Error("error_handler")) .Read(read => read.Url("http://novawebapi.azurewebsites.net/api/reports/ParkingRevenueByMonth")) ).Deferred() )
this is my webapi code
[HttpGet("ParkingRevenueByMonth")] public DataSourceResult ParkingRevenueByMonth([DataSourceRequest]DataSourceRequest request, int? Month = 0) { var model = reportsService.GetParkingRevenueByMonth(request, Month); return model; }
service layer
public DataSourceResult GetParkingRevenueByMonth(DataSourceRequest request, int? Month=0) { var now = DateTime.Now.ConvertToMalaysiaTime(); if (Month == null || Month == 0) { Month = now.Month; } var firstOfMonth = new DateTime(now.Year, (int)Month, 1); var endOfMonth = firstOfMonth.AddMonths(1).AddMilliseconds(-1); var list = unitOfWork.GetRepository<ParkTable>().GetAll().Where(w=> firstOfMonth.Date <= w.TimeStart.Date && w.TimeStart.Date <= endOfMonth.Date); var returnModel = list.Select(s => new ParkingRevenueViewModel { ParkDate = s.TimeStart.Date, VehRegNbr = s.VehRegNbr, LotNo = s.GeoRoadParkLot.GeoParkLot.LotNo, RoadName = s.GeoRoadParkLot.GeoRoad.Description, StartTime = s.TimeStart, Value = s.Amount }); return returnModel.ToDataSourceResult(request); }
the error thrown
at Kendo.Mvc.Infrastructure.Implementation.Expressions.GroupDescriptorExpressionBuilder.CreateProjectionNewExpression(IEnumerable`1 propertyValuesExpressions)at Kendo.Mvc.Infrastructure.Implementation.Expressions.GroupDescriptorExpressionBuilder.CreateProjectionInitExpression()at Kendo.Mvc.Infrastructure.Implementation.Expressions.GroupDescriptorExpressionBuilder.CreateAggregateFunctionsProjectionMemberBinding()at Kendo.Mvc.Infrastructure.Implementation.Expressions.QueryableAggregatesExpressionBuilder.<CreateMemberBindings>d__3.MoveNext()at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source, Int32& length)at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)at System.Dynamic.Utils.CollectionExtensions.ToReadOnly[T](IEnumerable`1 enumerable)at System.Linq.Expressions.Expression.MemberInit(NewExpression newExpression, IEnumerable`1 bindings)at Kendo.Mvc.Infrastructure.Implementation.Expressions.GroupDescriptorExpressionBuilder.CreateSelectExpression()at Kendo.Mvc.Infrastructure.Implementation.Expressions.GroupDescriptorExpressionBuilderBase.CreateQuery()at Kendo.Mvc.Extensions.QueryableExtensions.Aggregate(IQueryable source, IEnumerable`1 aggregateFunctions)at Kendo.Mvc.Extensions.QueryableExtensions.CreateDataSourceResult[TModel,TResult](IQueryable queryable, DataSourceRequest request, ModelStateDictionary modelState, Func`2 selector)at Kendo.Mvc.Extensions.QueryableExtensions.ToDataSourceResult(IEnumerable enumerable, DataSourceRequest request)at NI.Service.ReportsServices.GetParkingRevenueByMonth(DataSourceRequest request, Nullable`1 Month) in d:\documents\visual studio 2017\Projects\Nova\NI.Service\ReportsServices.cs:line 53at NI.WebApi.Controllers.ReportsController.ParkingRevenueByMonth(DataSourceRequest request, Nullable`1 Month) in d:\documents\visual studio 2017\Projects\Nova\TestApi2\Controllers\ReportsController.cs:line 32at lambda_method(Closure , Object , Object[] )at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__27.MoveNext()