Как агрегировать заказ по в C #? - PullRequest
0 голосов
/ 11 января 2019

Итак, у меня есть функция, подобная приведенной ниже, которая берет список объектов и продолжает включать их в мою строку запроса. Это прекрасно работает.

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

Но я хочу также объединить OrderBys. Здесь я сталкиваюсь с проблемами. У меня проблема в том, что нужно использовать OrderBy , затем использовать ThenBy в той же строке. Я попытался использовать для цикла первый порядок использования элемента к тому времени при использовании затем. Проблема, с которой я сталкиваюсь, заключается в том, что для того, чтобы активировать заказ, необходимо выполнить его на той же строке объекта.

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 ]

0 голосов
/ 11 января 2019

Проверьте это

   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));
0 голосов
/ 11 января 2019

Ваш запрос будет работать, если может иметь начальное начальное число OrderBy. Тогда вы можете связать. Как уже упоминалось, ThenBy требует IOrderedEnumerable (или IOrderedQueryable), прежде чем добавлять ThenBy предложения:

Ваш код будет выглядеть ниже:

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;

Ссылка: Как создать динамическое число предложений ThenBy в спецификации

0 голосов
/ 11 января 2019

Проблема в типе переменной 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);
...