我想在网格中对数据进行排序。我在网格中有多个列,单击网格标题列表应按该特定列排序。我正在使用linq从db和我的代码中对数据进行排序,如下所示:
var newsLetterData = _db.NewsLetterHistory.AsQueryable()
.OrderBy(**sortExp**)
.AsEnumerable()
.Select(x => x)
.ToList()
.Skip(pageIndex)
.Take(pageSize);
newsLetter = newsLetterData
.Select(x => new NewsLetterHistory
{
NewsLetterHistoryId = x.NewsLetterHistoryId,
Subject = x.Subject,
Content = x.Content,
TotalEmailSent = x.TotalEmailSent,
Receivers = x.Receivers,
CreatedDate = x.CreatedDate
})
.Select(z => z)
.ToList();
在上面的查询中,我使用“sortby”表达式对数据进行排序,而我正在创建这个动态排序表达式:
var paramExp = Expression.Parameter(typeof(TemplateProject.DataAccess.NewsLetterHistory),
typeof(TemplateProject.DataAccess.NewsLetterHistory).ToString());
Expression propConvExp = Expression.Convert(Expression.Property(paramExp, sortColumn), typeof(object));
var sortExp = Expression.Lambda<Func<TemplateProject.DataAccess.NewsLetterHistory, object>>(propConvExp, paramExp);
但是当我运行我的代码时,我收到了错误:
“无法将类型”
System.DateTime
“转换为”System.Object
“类型.LINQ to Entities仅支持转换EDM原语或枚举类型。”
任何人都知道如何解决这个问题,或者我如何创建动态排序来对linq中的数据进行排序?
答案 0 :(得分:1)
我找到了另一种在这里进行排序的方法,并修改了我的代码以创建动态排序表达式,如下所示:
Type newsLetterType = typeof(TemplateProject.DataAccess.NewsLetterHistory);
List<NewsLetterHistory> newsLetter = null;
if (newsLetterType.GetProperties().Any(prop => prop.Name == sortColumn))
{
PropertyInfo pinfo = newsLetterType.GetProperty(sortColumn);
Func<TemplateProject.DataAccess.NewsLetterHistory, object> orderByExpr = (news => pinfo.GetValue(news, null));
Func<IEnumerable<TemplateProject.DataAccess.NewsLetterHistory>, IOrderedEnumerable<TemplateProject.DataAccess.NewsLetterHistory>> sortFunc = null;
}
上面的代码对我来说很好。