按通用存储库中的多个字段排序

时间:2013-02-02 02:04:50

标签: entity-framework linq-to-entities

我的通用存储库中有以下方法,可以按字段名称排序。我需要知道如何通过多个字段来订购它。

public IList<TEntity> FindByExpressionOrdered(Expression<Func<TEntity, bool>> filter,
                                                params Expression<Func<TEntity, object>>[] orderBy)
{
    IOrderedQueryable<TEntity> query = SessionScope.Current.Set<TEntity>().Where(filter).OrderBy(orderBy.First());
    if (orderBy.Length > 1)
    {
        for (int i = 1; i < orderBy.Length; i++)
        {
            query = query.ThenBy(orderBy[i]);
        }
    }
    return query.ToList();
}

调用上面的内容会导致“无法将类型'System.Int64'转换为'System.Object'类型.LINQ to Entities仅支持转换实体数据模型基元类型。”异常。

IList<Product> prods = IoC.Resolve<IRepository<Product>>().FindByExpressionOrdered(p => p.IsActive && p.IsFavorite, p => p.Name, p => p.Id);

1 个答案:

答案 0 :(得分:1)

您可以使用Expression<Func<TEntity, object>>来排序表达式,它应该可以正常工作。

然后将您的方法更改为

public IList<TEntity> FindByExpression(Expression<Func<TEntity, bool>> filter,
                                                    Expression<Func<TEntity, object>> subSelector,
                                                    params Expression<Func<TEntity, object>>[] orders)
{
    var query = SessionScope.Current.Set<TEntity>().Include(subSelector).Where(filter).OrderBy(m => true);
    query = orders.Aggregate(query, (current, order) => current.ThenBy(order));

    return query.ToList();
}

但是有一天,你会想要选择订单方向......并且必须找到更聪明的方法!

没有“OrderBy(m =&gt; true”)技巧,并且你的评论(和同样的问题,如果orderBy params是一个空数组,这将失败),我会做

var query = SessionScope.Current.Set<TEntity>()
                        .Include(subSelector)
                        .Where(filter)
                        .OrderBy(orderBy.First());
foreach (var order in orderBy.Skip(1))
   query = query.OrderBy(order);