Как я могу использовать linq для вида несколькими полями?

Для Mac OS версии 1.13.1 (1.13.1) используйте CMD + P и введите имя файла, который вы хотите открыть.

21
задан rball 5 June 2009 в 21:59
поделиться

5 ответов

Есть две проблемы. Первый - это тот, на который ссылались другие - вам нужно использовать значение, возвращаемое OrderBy и т. Д. Второе, что каждый раз, когда вы вызываете OrderBy , это добавляет новый «основной» заказ. Вы действительно хотите ThenBy после применения первого порядка. К сожалению, это делает его довольно уродливым. После рефакторинга это все еще довольно некрасиво, но не тоже плохо ...

IEnumerable<Data> query = from item in items select item;
if (sortExpressionsExist)
{
    // Won't be read in the first iteration; will be written to
    IOrderedEnumerable<Data> orderedQuery = null;
    for (int i = 0; i < sortExpressions.Count; i++)
    {
        // Avoid single variable being captured: capture one per iteration.
        // Evil bug which would be really hard to find :)
        int copyOfI = i;
        // Tailor "object" depending on what GetProperty returns.
        Func<Data, object> expression = item => 
              item.GetType()
                  .GetProperty(sortExpressions[copyOfI].Name)
                  .GetValue(item, null);

        if (sortExpressions[i].Direction == SortDirection.Ascending)
        {
            orderedQuery = (i == 0) ? query.OrderBy(expression)
                                    : orderedQuery.ThenBy(expression);
        }
        else
        {
            orderedQuery = (i == 0) ? query.OrderByDescending(expression)
                                    : orderedQuery.ThenByDescending(expression);
        }
    }
    query = orderedQuery;
}
27
ответ дан 29 November 2019 в 20:43
поделиться

OrderBy возвращает новый IEnumerable, поэтому вам нужно сделать что-то вроде:

IEnumerable<Data> results 
    = query.OrderBy(item => item.GetType().GetProperty(sortExpressions[i].Name));
5
ответ дан 29 November 2019 в 20:43
поделиться

OrderBy на IEnumerable возвращает возвращает IOrderedEnumerable. Он не сортирует их по очереди. Так что получите возвращаемое значение из вашего .OrderBy, и все будет в порядке.

2
ответ дан 29 November 2019 в 20:43
поделиться

«Операторы» OrderBy / OrderByDescending работают как String.ToUpper (), то есть они берут то, на чем вы его вызываете, и создают «копию», в которой есть то, что вы просили.

Другими словами, вместо того, чтобы говорить:

query.Orderby(item->item.X)

, вы должны сделать

query = query.Orderby(item->item.X)

или

sortedResult = query.Orderby(item->item.X)

[И, как указывает Джон Скит, используйте ThenBy / ThenByDescending как в его ответе]

2
ответ дан 29 November 2019 в 20:43
поделиться

Запрос неизменяем, поэтому OrderBy возвращает новый объект. Вам нужно сделать тот же вызов, но добавить "query =" в начало.

query = query.OrderBy(item => item.GetType().GetProperty(sortExpressions[i].Name));
2
ответ дан 29 November 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: