Для запроса LINQ нужны или возрастание или в убывание в том же запросе

Есть ли так или иначе, этот код может быть пересмотрен? Единственной разницей является порядок частью.

Idealy я хотел бы использовать делегата/лямбда-выражение так код, является допускающим повторное использование, но я не знаю, как условно добавить и удалить операторы OrderBy и OrderByDescending запроса

var linq = new NorthwindDataContext();

        var query1 = linq.Customers
            .Where(c => c.ContactName.StartsWith("a"))
            .SelectMany(cus=>cus.Orders)
            .OrderBy(ord => ord.OrderDate)
            .Select(ord => ord.CustomerID);

        var query2 = linq.Customers
            .Where(c => c.ContactName.StartsWith("a"))
            .SelectMany(cus => cus.Orders)
            .OrderByDescending(ord => ord.OrderDate)
            .Select(ord => ord.CustomerID);
6
задан Romano Zumbé 3 July 2017 в 13:20
поделиться

4 ответа

Вы можете создать свой собственный многоразовый метод расширения, который будет делать это:

public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>
    (this IQueryable<TSource> source,
     Expression<Func<TSource, TKey>> keySelector,
     bool ascending)
{
     return ascending ? source.OrderBy(keySelector)
          : source.OrderByDescending(keySelector);
}

и аналогично для ThenBy:

public static IOrderedQueryable<TSource> ThenBy<TSource, TKey>
    (this IOrderedQueryable<TSource> source,
     Expression<Func<TSource, TKey>> keySelector,
     bool ascending)
{
     return ascending ? source.ThenBy(keySelector)
          : source.ThenByDescending(keySelector);
}
12
ответ дан 8 December 2019 в 16:00
поделиться

Для чисел и т. Д. Вы обычно можете просто инвертировать «переменную порядка».

Я не уверен в DateTime . Вы можете попробовать использовать Временной интервал .

0
ответ дан 8 December 2019 в 16:00
поделиться

Ну, если у вас есть условие, где вы решаете, является ли порядок по возрастанию или убыванию, вы можете использовать это

var query1 = linq.Customers
.Where(c => c.ContactName.StartsWith("a"))
.SelectMany(cus=>cus.Orders)

if(SortAscending)
   query1 = query1.OrderBy(ord => ord.OrderDate);
else
   query1 = query1.OrderByDescending(ord => ord.OrderDate);

var query2 = query1.Select(ord => ord.CustomerID);
0
ответ дан 8 December 2019 в 16:00
поделиться

Вы можете разделить запрос на биты и использовать логику потока управления. LINQ to SQL волшебным образом создаст правильный запрос, как если бы вы набрали его все одной строкой! Причина, по которой это работает, заключается в том, что запрос не отправляется в базу данных до тех пор, пока вы не запросите данные, а вместо этого сохраняется как выражение.

var linq = new NorthwindDataContext();
var query = linq.Customers
    .Where(c => c.ContactName.StartsWith("a"))
    .SelectMany(cus=>cus.Orders);

IOrderedQueryable<Order> query2;
if (useAscending) {
    query2 = query.OrderBy(ord => ord.OrderDate);
} else {
    query2 = query.OrderByDescending(ord => ord.OrderDate);
}

var query3 = query2.Select(ord => ord.CustomerID);
2
ответ дан 8 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

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