We use cookies to give you the best experience on our website. If you continue to browse, then you agree to our privacy policy and cookie policy. Image for the cookie policy date

QueryableDataOperations Execute method is not working when paging enabled

According to your KB: (https://www.syncfusion.com/kb/8434/server-side-api-for-datamanager-operations-with-iqueryable-data) we can use the method Execute of QueryableDataOperations instead of using individual methods.

The code in that page:

public ActionResult DataSource(DataManager data)
        {  
IQueryable<OrdersView> datasource = new NorthwindDataContext().OrdersViews;
            var count = datasource.AsQueryable().Count();
            var dm = QueryableDataOperations.Execute(datasource, data);
            return Json(new { result = dm, count = count });
        }
is not working when I filter, search the grid. The count always will be the original count. And each time I do a filter or a search the count must be that of the result.

3 Replies

MP Manivannan Padmanaban Syncfusion Team December 12, 2018 08:17 AM UTC

Hi Eduardo, 

Thanks for contacting syncfusion support. We are happy to assist you. 

Query: queryabledataoperations-execute-method-is-not-working-when-paging-enabled 
 
We are able to reproduce the reported issue at our end. In order to avoid the issue we need to update count after the operations performed. Please refer the below code example and sample link, 

// View page 

@(Html.EJ().Grid<object>("CellMerging") 
              .Datasource(ds => ds.URL("/Grid/DataSource").Adaptor("UrlAdaptor")) 
             .AllowFiltering() 
             .AllowSorting()    /*Sorting Enabled*/ 
             .AllowPaging()    /*Paging Enabled*/ 
             .Columns(col => 
            { 
                   …………… 
            })) 

// Controller Page 

       public ActionResult GridFeatures() 
        { 
 
 
            return View(); 
 
        } 
        public ActionResult DataSource(DataManager data) 
        { 
            IQueryable<OrdersView> datasource = new NorthwindDataContext().OrdersViews; 
            var count = datasource.AsQueryable().Count(); 
            var dm = QueryableDataOperations.Execute(datasource, data); 
            if (data.Where != null || data.Search != null || data.Sorted != null) 
                count = dm.Count(); 
            return Json(new { result = dm, count = count }); 
 
        } 


Regards, 
Manivannan Padmanaban. 



ED Eduardo December 13, 2018 06:49 AM UTC

It would be a good practice for you to verify first before suggesting a supposed solution. I think this type of answers are of detriment for Syncfusion.

First: Your code snippet has errors.
public ActionResult DataSource(DataManager data) 
It should be:
public ActionResult DataSource([FromBody] DataManager data) 

Two: datasource is of type IQueryable
 IQueryable<OrdersView> datasource
then you don't need datasource.AsQueryable().Count();
It would be enough:
datasource.Count();

Three and most important: your code is not working
When I apply a filter (Excel like) the grid only shows 12 items (the same value of the Take default setup)

I have attached a video of this behavior.

Please, verify before suggesting a solution.

Regards,
Eduardo Viñuela


Attachment: gridqueryableexecuteerror_1631eed3.zip


VN Vignesh Natarajan Syncfusion Team December 19, 2018 04:01 AM UTC

Hi Eduardo, 
 
Sorry for the inconvenience caused. 
 
Query: “When I apply a filter (Excel like) the grid only shows 12 items (the same value of the Take default setup)” 
 
We have analyzed the reported issue and video demo shared. We have prepared a sample as per your suggestion and we are able to reproduce the reported issue at our end.  This is because while using individual method like performSorting , performWhereFilter we have updated the count value once the filtering and search operation is completed. Refer the below code example 
 
public ActionResult DataSource([FromBody]DataManager data) 
        { 
            IQueryable<OrdersView> datasource = new NorthwindDataContext().OrdersViews; 
            if (data.Where != null) // for filtering 
                datasource = QueryableDataOperations.PerformWhereFilter(datasource, data.Where, data.Where[0].Condition); 
            if (data.Sorted != null)//for sorting 
                datasource = QueryableDataOperations.PerformSorting(datasource, data.Sorted); 
            if (data.Search != null) 
                datasource = QueryableDataOperations.PerformSearching(datasource, data.Search); 
            int count = datasource.Count(); 
            if (data.Skip >= 0)//for paging 
                datasource = QueryableDataOperations.PerformSkip(datasource, data.Skip); 
            if (data.Take > 0)//for paging 
                datasource = QueryableDataOperations.PerformTake(datasource, data.Take); 
            return Json(new { result = datasource.ToList(), count = count }, JsonRequestBehavior.AllowGet); 
        } 
 
 
But while using execute method, will perform all the actions like performWhereFilter,perforSorting,performSarching,performTake due to which the dataSource is reduced to current view data (current page size). So once executing the Execute method, if we take the count it will be current page size only. So it is not possible return correct count value after filtering. To overcome this issue, you can use individual methods like performWhereFilter and return the count before performTake method. 
 
If you still wish to use Execute method, we suggest you to use below workaround to resolve the issue. 
 
public ActionResult UrlDataSource([FromBody]DataManager data) 
        { 
 
            IQueryable<OrdersView> datasource = new NorthwindDataContext().OrdersViews; 
            var count = datasource.Count();         
            datasource = QueryableDataOperations.Execute(datasource, dm); 
            if (data.Where != null) // to update the count value while filtering 
            { 
IQueryable<OrdersView> data = QueryableDataOperations.PerformWhereFilter(new NorthwindDataContext().OrdersViews, data.Where, data.Where[0].Condition); 
                count = data.Count(); 
            } 
            if (data.Search != null)// to update the count value while searching 
            { 
IQueryable<OrdersView> data = QueryableDataOperations.PerformSearching(new NorthwindDataContext().OrdersViews, data.Search); 
                count = data.Count(); 
            } 
            return Json(new { result = datasource, count = count });           
        } 
 
  
Please get back to us if you have further queries. 
 
Regards, 
Vignesh Natarajan   


Loader.
Live Chat Icon For mobile
Up arrow icon