Я использую T4 для генерации репозиториев для сущностей LINQ to Entities.
Хранилище содержит (среди прочего) метод List, подходящий для подкачки страниц. Документация по поддерживаемым и неподдерживаемым методам не упоминает об этом, но вы не можете "вызвать" Skip
для неупорядоченного IQueryable
. Это вызовет следующее исключение:
System.NotSupportedException: метод «Пропустить» поддерживается только для
отсортированный ввод в LINQ to Entities. Метод OrderBy должен быть вызван до
метод "Пропустить" ..
Я решил это, позволив определить сортировку по умолчанию с помощью частичного метода. Но у меня возникают проблемы с проверкой, действительно ли дерево выражений содержит OrderBy
.
Я уменьшил проблему до как можно меньшего количества кода:
public partial class Repository
{
partial void ProvideDefaultSorting(ref IQueryable<Category> currentQuery);
public IQueryable<Category> List(int startIndex, int count)
{
IQueryable<Category> query = List();
ProvideDefaultSorting(ref query);
if (!IsSorted(query))
{
query = query.OrderBy(c => c.CategoryID);
}
return query.Skip(startIndex).Take(count);
}
public IQueryable<Category> List(string sortExpression, int startIndex, int count)
{
return List(sortExpression).Skip(startIndex).Take(count);
}
public IQueryable<Category> List(string sortExpression)
{
return AddSortingToTheExpressionTree(List(), sortExpression);
}
public IQueryable<Category> List()
{
NorthwindEntities ent = new NorthwindEntities();
return ent.Categories;
}
private Boolean IsSorted(IQueryable<Category> query)
{
return query is IOrderedQueryable<Category>;
}
}
public partial class Repository
{
partial void ProvideDefaultSorting(ref IQueryable<Category> currentQuery)
{
currentQuery = currentQuery.Where(c => c.CategoryName.Contains(" ")); // no sorting..
}
}
Это не моя настоящая реализация!
Но мой вопрос : как мне реализовать метод IsSorted
? Проблема в том, что запросы LINQ to Entities всегда имеют тип ObjectQuery
, который реализует IOrderedQueryable
.
Итак, как мне убедиться, что в дереве выражений присутствует метод OrderBy
? Является ли единственная возможность разбора дерева?
Обновление
Я добавил две другие перегрузки, чтобы пояснить, что речь идет не о том, как добавить поддержку сортировки в репозиторий, а о том, как проверить, действительно ли частичный метод ProvideDefaultSorting
добавил OrderBy
в дерево выражений.
Проблема в том, что первый частичный класс генерируется шаблоном, а реализация второй части частичного класса выполняется членом команды в другое время. Вы можете сравнить его с тем, как .NET Entity Framework генерирует EntityContext, он позволяет использовать точки расширения для других разработчиков. Поэтому я хочу попытаться сделать его устойчивым и не аварийно завершать работу, если ProvideDefaultSorting
не реализован правильно.
Так что, возможно, вопрос больше, как я могу подтвердить, что ProvideDefaultSorting
действительно добавил сортировку в дерево выражений.
Обновление 2
На новый вопрос ответили и приняли, я думаю, что я должен изменить название, чтобы оно больше соответствовало вопросу. Или я должен оставить текущее название, потому что это приведет людей с такой же проблемой к этому решению?