У меня есть два метода сортировки в абстракции для моего обработчика запросов медиатора. Первый обрабатывает Expression<Func<T,object>>
для базы данных с сущностью, а второй обрабатывает то же самое для IEnumerable с ViewModel. Свойства и так далее всего выражения одинаковы для обоих, кроме типа. (DatabaseModel и ViewModel)
Мой вопрос: есть ли способ реализовать это и предотвратить почти одинаковую реализацию выражений в классах ISortConditions? Один для ViewModel и один для Entity. Или я должен определенно go с разделенными классами для различных типов из-за некоторого принципа, который я еще не изучил?
public abstract class AbstractRequestHandler<T> where T : class, ISortable, new()
{
protected IQueryable<T> SortView(ISortConditions<T> sorting, IQueryable<T> value)
{
var ordered = value.OrderBy(sorting.OrderBy());
foreach (var thenby in sorting.ThenBy())
{
ordered = ordered.ThenBy(thenby);
}
return ordered;
}
protected async Task SortEnumerableBy<TGroups, TItem>(ISortConditions<TItem> sorting,
ObservableRangeCollection<TGroups> value) where TItem : class, ISortable, new() where TGroups : ObservableRangeCollection<TItem>
{
await Task.Run(async () =>
{
value.ForEach(async fe =>
fe.InternalSort(await Task.Run(() =>
{
var result = fe.OrderBy(sorting.OrderBy().Compile());
sorting.ThenBy().ForEach(fea =>
{
result = result.ThenBy(fea.Compile());
});
return result;
})
));
});
}
Реализация ISortCondition, которую необходимо дублировать для каждой пары Entity / ViewModel.
public class OrdersViewSorting : ISortConditions<OrdersView>
{
private List<Expression<Func<OrdersView, object>>> ThenBy
{
get
{
return new List<Expression<Func<OrdersView, object>>>()
{
ordersView=>ordersView.OrderId,
ordersView=>ordersView.OrderDate
};
}
}
private Expression<Func<OrdersView, object>> OrderBy
{
get
{
return ordersView => ordersView.UpdateTime;
}
}
string ISortConditions<OrdersView>.Title()
{
return Title;
}
List<Expression<Func<OrdersView, object>>> ISortConditions<OrdersView>.ThenBy()
{
return ThenBy;
}
Expression<Func<OrdersView, object>> ISortConditions<OrdersView>.OrderBy()
{
return OrderBy;
}