Есть ли так или иначе, этот код может быть пересмотрен? Единственной разницей является порядок частью.
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);
Вы можете создать свой собственный многоразовый метод расширения, который будет делать это:
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);
}
Для чисел и т. Д. Вы обычно можете просто инвертировать «переменную порядка».
Я не уверен в DateTime
. Вы можете попробовать использовать Временной интервал
.
Ну, если у вас есть условие, где вы решаете, является ли порядок по возрастанию или убыванию, вы можете использовать это
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);
Вы можете разделить запрос на биты и использовать логику потока управления. 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);