开发者

ASP NET MVC Error In Function

开发者 https://www.devze.com 2022-12-28 16:44 出处:网络
This is my code. I got this s开发者_高级运维ample from the Internet and I tried to modify it. private void FillGridData()

This is my code. I got this s开发者_高级运维ample from the Internet and I tried to modify it.

    private void FillGridData()
    {
        //IQueryable<SVC> query = _customerService.GetQueryable();

        _dataContext = new dbServiceModelDataContext();
        var query = from m in _dataContext.SVCs
                    select m;

        query = AddQuerySearchCriteria(query, _grid.SearchForm);

        int totalRows = query.Count();
        _grid.Pager.Init(totalRows);

        if (totalRows == 0)
        {
            _grid.Data = new List<SVC>();
            return;
        }

        query = AddQuerySorting(query, _grid.Sorter);
        query = AddQueryPaging(query, _grid.Pager);

        List<SVC> customers = query.ToList(); //***ERROR IN HERE***//
        _grid.Data = customers;
    }

The error says "Cannot order by type 'System.Object'.", what is the matter? Do you have solution for me?

This is The AddQuerySorting Method THE PROBLEM IS IN HERE

is there anything wrong about the code? :(

    private IQueryable<SVC> AddQuerySorting(IQueryable<SVC> query, Sorter sorter)
    {
        if (String.IsNullOrEmpty(sorter.SortField))
            return query;

        //Used approach from http://www.singingeels.com/Articles/Self_Sorting_GridView_with_LINQ_Expression_Trees.aspx
        //instead of a long switch statement 
        var param = Expression.Parameter(typeof(SVC), "customer");
        var sortExpression = Expression.Lambda<Func<SVC, object>>
                                (Expression.Convert(Expression.Property(param, sorter.SortField), typeof(object)), param);

        if (sorter.SortDirection == SortDirection.Asc)
            query = query.OrderBy(sortExpression);
        else
            query = query.OrderByDescending(sortExpression);

        return query;
    }

here is AddQueryPaging Method

    private IQueryable<SVC> AddQueryPaging(IQueryable<SVC> query, Pager pager)
    {
        if (pager.TotalPages == 0)
            return query;

        query = query.Skip((pager.CurrentPage - 1) * pager.PageSize)
                            .Take(pager.PageSize);
        return query;
    }

Sorter

    using System;
    using System.Collections.Generic;
    using System.Collections.Specialized;
    using System.Linq;
    using System.Web;

    namespace MvcGridSample.ViewModels.Shared
    {

        public enum SortDirection
        {
            Asc = 1,
            Desc = 2
        }


        public class Sorter
        {
            //Properties
            public string SortField { get; set; }
            public SortDirection SortDirection { get; set; }

            public Sorter()
            {
                this.SortDirection = SortDirection.Asc;
            }


            public Sorter(string sortField, SortDirection sortDirection)
            {
                Verify.Argument.IsNotEmpty(sortField, "sortField");
                Verify.Argument.IsNotEmpty(sortField, "sortDirection");

                this.SortField = sortField;
                this.SortDirection = sortDirection;
            }


            public void AddToQueryString(NameValueCollection queryString)
            {
                queryString["Sorter.SortField"] = this.SortField;
                queryString["Sorter.SortDirection"] = this.SortDirection.ToString();
            }
        }
    }


Look at the line:

var sortExpression = Expression.Lambda<Func<SVC, object>>

That should immediately leap out as the cause. The generated Expression must be suitable typed. This type of metaprogramming often involves either using the non-generic API, or using reflection to create the correct type on the fly. Fortunately, a suitable example is here. You should be able to use that approach re MakeGenericMethod (or simpler: just use the code "as is" from inside AddQuerySorting).

0

精彩评论

暂无评论...
验证码 换一张
取 消