This is a migrated thread and some comments may be shown as answers.

System.NotSupportedException: The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'

2 Answers 785 Views
Grid
This is a migrated thread and some comments may be shown as answers.
ehsan sadeghi
Top achievements
Rank 1
ehsan sadeghi asked on 24 Jan 2013, 09:28 AM
@model System.Collections.IEnumerable
 
  
 
@(Html.Kendo().Grid<HoghoughModel.PTStbKarkonan>()
    .Name("Grid")
    .EnableCustomBinding(true)
    .BindTo(Model)
    .Columns(columns => {
        columns.Bound(o => o.IssuePlace);
        columns.Bound(o => o.BimehName);
        columns.Bound(o => o.Family);
        columns.Bound(o => o.Name);
    })
    .Pageable()
    .Sortable()
    .Filterable()
    .Scrollable()
    .Groupable()
    .DataSource(dataSource => dataSource.Server().Total((int)ViewData["total"]))
)
and this code for populating grid :
    public ActionResult Index([DataSourceRequest(Prefix = "Grid")] DataSourceRequest request)
    {
        if (request.PageSize == 0)
        {
            request.PageSize = 10;
        }
 
        IQueryable<PTStbKarkonan> karkonan = db.PTStbKarkonans;
 
        karkonan = karkonan.ApplyFiltering(request.Filters);
 
        var total = karkonan.Count();
 
        karkonan = karkonan.ApplySorting(request.Groups, request.Sorts);
 
        karkonan = karkonan.ApplyPaging(request.Page, request.PageSize);
 
        IEnumerable data = karkonan.ApplyGrouping(request.Groups);
 
        ViewData["total"] = total;
 
        return View(data);
    }
 
public static class PTStbKarkonanExtensions
{
    public static IQueryable<PTStbKarkonan> ApplyPaging(this IQueryable<PTStbKarkonan> data, int page, int pageSize)
    {
        if (pageSize > 0 && page > 0)
        {
            data = data.Skip((page - 1) * pageSize);
        }
 
        data = data.Take(pageSize);
 
        return data;
    }
 
    public static IEnumerable ApplyGrouping(this IQueryable<PTStbKarkonan> data, IList<GroupDescriptor>
        groupDescriptors)
    {
        if (groupDescriptors != null && groupDescriptors.Any())
        {
            Func<IEnumerable<PTStbKarkonan>, IEnumerable<AggregateFunctionsGroup>> selector = null;
            foreach (var group in groupDescriptors.Reverse())
            {
                if (selector == null)
                {
                    if (group.Member == "IssuePlace")
                    {
                        selector = Orders => BuildInnerGroup(Orders, o => o.IssuePlace);
                    }
                    else if (group.Member == "BimehName")
                    {
                        selector = Orders => BuildInnerGroup(Orders, o => o.BimehName);
                    }
                    else if (group.Member == "Family")
                    {
                        selector = Orders => BuildInnerGroup(Orders, o => o.Family);
                    }
                    else if (group.Member == "Name")
                    {
                        selector = Orders => BuildInnerGroup(Orders, o => o.Name);
                    }
                }
                else
                {
                    if (group.Member == "IssuePlace")
                    {
                        selector = BuildGroup(o => o.IDSeri, selector);
                    }
                    else if (group.Member == "BimehName")
                    {
                        selector = BuildGroup(o => o.BimehName, selector);
                    }
                    else if (group.Member == "Family")
                    {
                        selector = BuildGroup(o => o.Family, selector);
                    }
                    else if (group.Member == "Name")
                    {
                        selector = BuildGroup(o => o.Name, selector);
                    }
                }
            }
 
            return selector.Invoke(data).ToList();
        }
 
        return data;
    }
 
    private static Func<IEnumerable<PTStbKarkonan>, IEnumerable<AggregateFunctionsGroup>>
        BuildGroup<T>(Expression<Func<PTStbKarkonan, T>> groupSelector, Func<IEnumerable<PTStbKarkonan>,
        IEnumerable<AggregateFunctionsGroup>> selectorBuilder)
    {
        var tempSelector = selectorBuilder;
        return g => g.GroupBy(groupSelector.Compile())
                     .Select(c => new AggregateFunctionsGroup
                     {
                         Key = c.Key,
                         HasSubgroups = true,
                         Member = groupSelector.MemberWithoutInstance(),
                         Items = tempSelector.Invoke(c).ToList()
                     });
    }
 
    private static IEnumerable<AggregateFunctionsGroup> BuildInnerGroup<T>(IEnumerable<PTStbKarkonan>
        group, Expression<Func<PTStbKarkonan, T>> groupSelector)
    {
        return group.GroupBy(groupSelector.Compile())
                .Select(i => new AggregateFunctionsGroup
                {
                    Key = i.Key,
                    Member = groupSelector.MemberWithoutInstance(),
                    Items = i.ToList()
                });
    }
    public static IQueryable<PTStbKarkonan> ApplySorting(this IQueryable<PTStbKarkonan> data,
                IList<GroupDescriptor> groupDescriptors, IList<SortDescriptor> sortDescriptors)
    {
        if (groupDescriptors != null && groupDescriptors.Any())
        {
            foreach (var groupDescriptor in groupDescriptors.Reverse())
            {
                data = AddSortExpression(data, groupDescriptor.SortDirection, groupDescriptor.Member);
            }
        }
 
        if (sortDescriptors != null && sortDescriptors.Any())
        {
            foreach (SortDescriptor sortDescriptor in sortDescriptors)
            {
                data = AddSortExpression(data, sortDescriptor.SortDirection, sortDescriptor.Member);
            }
        }
 
        return data;
    }
 
    private static IQueryable<PTStbKarkonan> AddSortExpression(IQueryable<PTStbKarkonan> data, ListSortDirection
                sortDirection, string memberName)
    {
        if (sortDirection == ListSortDirection.Ascending)
        {
            switch (memberName)
            {
                case "IssuePlace":
                    data = data.OrderBy(order => order.IssuePlace);
                    break;
                case "BimehName":
                    data = data.OrderBy(order => order.BimehName);
                    break;
                case "Family":
                    data = data.OrderBy(order => order.Family);
                    break;
                case "Name":
                    data = data.OrderBy(order => order.Name);
                    break;
            }
        }
        else
        {
            switch (memberName)
            {
                case "IssuePlace":
                    data = data.OrderByDescending(order => order.IssuePlace);
                    break;
                case "BimehName":
                    data = data.OrderByDescending(order => order.BimehName);
                    break;
                case "Family":
                    data = data.OrderByDescending(order => order.Family);
                    break;
                case "Name":
                    data = data.OrderByDescending(order => order.Name);
                    break;
            }
        }
        return data;
    }
 
    public static IQueryable<PTStbKarkonan> ApplyFiltering(this IQueryable<PTStbKarkonan> data,
        IList<IFilterDescriptor> filterDescriptors)
    {
        if (filterDescriptors != null && filterDescriptors.Any())
        {
            data = data.Where(ExpressionBuilder.Expression<PTStbKarkonan>(filterDescriptors));
        }
        return data;
    }
}
I use EntityFramework. When I run project I get 
System.NotSupportedException: The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'

2 Answers, 1 is accepted

Sort by
0
ehsan sadeghi
Top achievements
Rank 1
answered on 24 Jan 2013, 09:58 AM
I Solved this by order befor assign to grid.
0
Atanas Korchev
Telerik team
answered on 24 Jan 2013, 09:58 AM
Hi,

 This is a well known issue of Entity Framework. It requires OrderBy to be called before Skip (as the exception message suggests). Here is a possible solution.

Regards,
Atanas Korchev
the Telerik team
Join us on our journey to create the world's most complete HTML 5 UI Framework - download Kendo UI now!
Tags
Grid
Asked by
ehsan sadeghi
Top achievements
Rank 1
Answers by
ehsan sadeghi
Top achievements
Rank 1
Atanas Korchev
Telerik team
Share this question
or