我的通用存储库中有以下方法,可以按字段名称排序。我需要知道如何通过多个字段来订购它。
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);
答案 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);