使用可空列进行动态排序

时间:2014-04-22 05:38:18

标签: linq sorting dynamic

我正在使用lambda表达式编写动态排序,如下所示:

string sortColumn = imageFilterType == 1 ? "CreatedDate" : "AbuseCount";
var paramExp = Expression.Parameter(typeof(Items), typeof(Items).ToString());
Expression propConvExp = Expression.Convert(Expression.Property(paramExp, sortColumn), typeof(object));
var sortExp = Expression.Lambda<Func<Items, object>>(propConvExp, paramExp);

上面我正在创建动态排序列,我在下面的查询中应用了这个sortexpression:

var items = _db.Items.AsQueryable()
                     .AsExpandable()
                     .OrderByDescending(sortExp)
                     .Where(predicate)
                     .Select(x => x)
                     .Join(_db.Users, i => i.UserId, u => u.UserID, (i, u) => new
                        {
                            i,
                            FullName = u.UserType == 1 ? u.FirstName + " " + u.LastName : u.CompanyName,
                            u.UserType,
                            u.UserName
                        })
                    .ToList()
                    .Skip(pageIndex)
                    .Take(pageSize);

我在输入中有2列,我必须对数据进行排序,其中一列是CreatedDate,另一列是Abusecount。我必须在两个列中应用一列排序。但是当我试图运行上面的代码时,我收到了错误:

  

“无法将类型'System.Nullable`1'强制转换为'System.Object'.LINQ to Entities仅支持转换EDM原语或枚举类型。”

因为在我的数据库中,这两列都是可以为空的类型,因为我遇到了这个问题。有人有解决这个问题的方法吗?我不想改变DB。我只能从前端解决它。 任何帮助都会受到高度关注。

1 个答案:

答案 0 :(得分:0)

试试这个,#39;这么简单:

var items = _db.Items.AsQueryable()
                 .AsExpandable();
if (imageFilterType == 1)
   items=items.OrderByDescending(a=>a.CreatedDate);
else
   items=items.OrderByDescending(a=>a.AbuseCount);

items=items.Where(predicate)
                 .Select(x => x)
                 .Join(_db.Users, i => i.UserId, u => u.UserID, (i, u) => new
                    {
                        i,
                        FullName = u.UserType == 1 ? u.FirstName + " " + u.LastName : u.CompanyName,
                        u.UserType,
                        u.UserName
                    })
                 .Skip(pageIndex)
                 .Take(pageSize)
                 .ToList();