Я использую T4 для создания репозиториев для объектов LINQ to Entities.Как проверить наличие OrderBy в дереве выражений ObjectQuery <T>
Репозиторий содержит (среди прочего) метод списка, подходящий для подкачки. Документация для Supported and Unsupported Methods не упоминает об этом, но вы не можете «позвонить» Skip
по неупорядоченному IQueryable
. Это поднимет следующее исключение:
System.NotSupportedException: Метод «Пропустить» поддерживается только для отсортированного ввода в LINQ к 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
? Единственный вариант для синтаксического анализа дерева?
Update
Я добавил два других перегрузки, чтобы сделать ясно, что речь идет не о том, как добавить сортировку поддержки в хранилище, но как проверить, если метод частичного ProvideDefaultSorting
действительно добавляет OrderBy
к выражению дереву ,
Проблема заключается в том, что первый частичный класс генерируется шаблоном, а реализация второй части частичного класса производится членом команды в другое время. Вы можете сравнить его с тем, как .NET Entity Framework генерирует EntityContext, он позволяет использовать точки расширения для других разработчиков. Поэтому я хочу попытаться сделать его надежным и не сбой, если ProvideDefaultSorting
не выполнен правильно.
Так что, может быть, вопрос больше, как я могу подтвердить, что ProvideDefaultSorting
действительно добавил сортировку в дерево выражений.
Update 2
Новый вопрос был дан ответ, и принял, я думаю, что я должен изменить название, чтобы соответствовать вопрос больше. Или я должен оставить текущий заголовок, потому что это приведет людей с той же проблемой к этому решению?
Вы должны увидеть этот ответ http://stackoverflow.com/questions/36923850/how-to-know-if-orderby-was-applied-to-query – yosbel 2016-04-28 20:24:04