使用linq进行动态排序时出错

时间:2014-05-03 07:18:15

标签: linq sorting

我想在网格中对数据进行排序。我在网格中有多个列,单击网格标题列表应按该特定列排序。我正在使用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中的数据进行排序?

1 个答案:

答案 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;
}

上面的代码对我来说很好。