То, что вы делаете в своем коде, не будет работать. Однако я немного удивлен, что LINQ to SQL не вызывает исключения.
Метод OrderBy
, который вы вызываете в result.OrderBy(expression)
, является методом Enumerable.OrderBy
, а не методом Queryable.OrderBy
. Вы уже заметили это, потому что объект, который он возвращает, это IEnumerable(Of User)
, а не IQueryable(Of User)
. По этой причине вы конвертируете его в IQueryable(Of User)
, вызывая AsQueryable()
. Однако, вызов AsQyeryable
не может работать. Причина этого в том, что LINQ to SQL обрабатывает деревья выражений (что в сущности означает IQueryable
). И деревья выражений могут быть динамически объединены, как вы уже делаете с result = result.Skip
. Enumerable
однако, не работает с деревьями выражений, но с делегатами, которые являются вызовами скомпилированных методов. Хотя вы можете преобразовать такой вызов скомпилированного метода в IQueryable
, LINQ to SQL не может его проанализировать, поскольку он все еще является скомпилированным кодом (для этого потребуется самоанализ, который поддерживают только специализированные инструменты, такие как Reflector). В этом случае LINQ to SQL, вероятно, проигнорировал полный порядок по части вашего запроса, поскольку обнаружил (скомпилированный) вызов метода, который не может быть обработан.
Итак, ваше решение будет работать только тогда, когда вы выполните следующее:
Dim expression As Expression(Of Func(Of User, [ExpectedKeyHere]) = _
... creation of the expression here ...
Select Case s.SortOrder
Case SortExpression.SortDirection.Ascending
result = result.OrderBy(expression)
Case SortExpression.SortDirection.Descending
result = result.OrderByDescending(expression)
End Select
Однако есть еще одна вещь. Кажется, вы просматриваете набор sortExpressions
. Хотя можно добавить уже отсортированную коллекцию, уже отсортированная коллекция должна вызываться с помощью result.ThenBy
или result.ThenByDescending
. Вызов с result.OrderBy
полностью прибегнет к нему; Вы потеряете первоначальный порядок сортировки.
Короче говоря, возможно, вам следует попытаться создать какой-то объект EntitySorter
, который позволяет вызывающим объектам вашего метода указывать порядок сортировки. Ваш метод обслуживания может выглядеть следующим образом (извините, это C #):
public static Person[] GetAllPersons(IEntitySorter<Person> sorter)
{
Condition.Requires(sorter, "sorter").IsNotNull();
using (var db = ContextFactory.CreateContext())
{
IOrderedQueryable<Person> sortedList =
sorter.Sort(db.Persons);
return sortedList.ToArray();
}
}
Я написал блог именно об этом , опять же, это C #, но я думаю, что он будет делать именно то, что вам нужно.
Удачи.