代码之家  ›  专栏  ›  技术社区  ›  Demodave

如何在c#中聚合order by?

  •  0
  • Demodave  · 技术社区  · 7 年前

    query = includeExpressions.Aggregate(query, (current, include) => current.Include(include));
    

    但我想做的是聚合orderby。这就是我遇到问题的地方。我的问题是一个人必须使用 排序 然后使用 然后 在同一条线上。我已经尝试使用for循环,先使用物品,然后再使用物品。我遇到的问题是,为了激活thenby,order by需要在同一个对象行上继续。

    query.OrderBy(orderBy).ThenBy
    

    我做不到

    var usedOrderBy = true;
            foreach (var orderBy in orderBys)
            {
                if (usedOrderBy)
                {
                    query = query.OrderBy(orderBy);
    
                    usedOrderBy = true;
                }
                else
                {
                    query = query.ThenBy(orderBy); // <-- Can not locate thenby
                }
            }
    
    any ides.
    

    我想这样进去

    orderItems(x => x.Item1, x => x.Item2)
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   Robert Harvey    7 年前

    问题出在 query 变量 ThenBy 是可应用于的扩展方法 System.Linq.IOrderedEnumerable<TSource> System.Linq.IOrderedQueryable<TSource> 所以你不能就这么做

    IEnumerable<Point> points = GetPoints();
    points = points.OrderBy(p => p.X);
    points = points.ThenBy(p => p.Y);
    

    对于预排序结果,您应该有一个额外的变量来解决您的场景,如下面的示例所示:

    IEnumerable<Point> points = GetPoints();
    var orderedPoints = points.OrderBy(p => p.X);
    orderedPoints = orderedPoints.ThenBy(p => p.Y);
    
        2
  •  0
  •   Gauravsa    7 年前

    如果您的查询可以有 OrderBy ThenBy 需要 IOrderedEnumerable IOrderedQueryable )在连接之前先安装 条款:

    您的代码如下所示:

    IOrderedQueryable<T> orderedQuery = null;
    for(int temp = 0; temp < orderBys.Count; temp++)
    {
        if(temp == 0)
            orderedQuery = query.OrderBy(orderBys[temp]);
    
        else orderedQuery = orderedQuery.ThenBy(orderBys[temp]);  
    }
    query = orderedQuery ?? query;
    

    参考: How to generate a dynamic number of ThenBy clauses in a Specification

        3
  •  0
  •   Demodave    7 年前

    检查这个

       var orderByList = new List<Expression<Func<TEntity, object>>>();
                Expression<Func<TEntity,object>> orderBy1 = x => x.Id;
                Expression<Func<TEntity, object>> orderBy2 = x => x.ToString();
                Expression<Func<TEntity, object>> orderBy3 = x => x.Id;
                orderByList.Add(orderBy1);
                orderByList.Add(orderBy2);
                orderByList.Add(orderBy3);
    
                var resultOrderedQueryable = orderByList.Aggregate<Expression<Func<TEntity, object>>, IOrderedQueryable<TEntity>>(null, (current, orderBy) => current != null ? current.ThenBy(orderBy) : query.OrderBy(orderBy));