Сортировка IQueryable по совокупности в VB.net - PullRequest
2 голосов
/ 16 декабря 2008

искал быстрый пример сортировки IQueryable (используя Linq To SQL) с использованием значения Aggregate.

Мне нужно вычислить несколько производных значений (разница в процентах между двумя значениями и т. Д.) И отсортировать результаты по этому.

т.е.

вернуть строки. OrderBy (Function (s) CalcValue (s.Visitors, s.Clicks))

Я хочу вызвать внешнюю функцию для расчета Агрегата. Должно ли это реализовать IComparer? или IComparable?

спасибо

[EDIT] Пытался использовать:

Public Class SortByCPC : Implements IComparer(Of Statistic)

Public Function Compare(ByVal x As Statistic, ByVal y As Statistic) As Integer Implements System.Collections.Generic.IComparer(Of Statistic).Compare
    Dim xCPC = x.Earnings / x.Clicks
    Dim yCPC = y.Earnings / y.Clicks
    Return yCPC - xCPC
End Function

End Class

LINQ to SQL не любит меня, используя IComparer

Ответы [ 3 ]

2 голосов
/ 16 декабря 2008

LINQ to SQL никогда не понравится вам, если вы используете свои собственные методы в запросе - он не может увидеть их и определить, как должен выглядеть SQL. Он может видеть только внутри деревьев выражений, построенных из лямбда-выражений в запросе.

То, что вы хотите, это что-то вроде:

Dim stats = From x in db.Statistics
            Where (something, if you want filtering)
            Order By x.Earnings / x.Clicks;

Если вы действительно хотите получить все результаты и затем упорядочить их, вам нужно указать LINQ, что вы «сделали» со стороны IQueryable - вызовите AsEnumerable () , а затем Вы можете выполнить любую оставшуюся обработку на клиенте. Лучше заставить сервер делать как можно больше.

0 голосов
/ 17 декабря 2008

Мое решение:

Dim stats = rows.OrderBy(Function(s) If(s.Visitors > 0, s.Clicks / s.Visitors, 0))

Это также ловит любое деление на ноль исключений

0 голосов
/ 16 декабря 2008

Мой VB довольно плох, но я думаю, что так оно и должно быть. Предполагается, что CalcValues ​​возвращает значение типа double, а тип rows - RowClass. В этом примере не используется версия IComparer расширения OrderBy, но он опирается на тот факт, что значения типа double уже сопоставимы, и возвращает значение CalcValue (предполагаемое как double) в качестве ключа.

Dim keySelector As Func(Of Double, RowClass) = _
     Func( s As RowClass) CalcValue( s.Visitors, s.Clicks )

return rows.OrderBy( keySelector )

Вот несколько ссылок, которые могут вам пригодиться.

IQueryable.OrderBy метод расширения

Лямбда-выражения для Visual Basic

...