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
).
精彩评论