2

集計値を使用して IQueryable (Linq To SQL を使用) を並べ替える簡単な例を探していました。

基本的に、いくつかの派生値 (2 つの値のパーセンテージ差など) を計算し、これによって結果を並べ替える必要があります。

すなわち

return rows.OrderBy(Function(s) CalcValue(s.Visitors, s.Clicks))

Aggregateを計算するために外部関数を呼び出したいです。これは IComparer を実装する必要がありますか? またはIComparable?

ありがとう

[編集] 使用しようとしました:

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 の使用を好みません

4

3 に答える 3

2

LINQ to SQL は、クエリ内で独自のメソッドを使用することを決して好まないでしょう。それらの内部を見て、SQL をどのように見せたいかを理解することはできません。クエリ内のラムダ式から構築された式ツリー内のみを表示できます。

あなたが望むのは次のようなものです:

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

本当にすべての結果をフェッチしてから並べ替えたい場合は、IQueryable 側で「完了」したことを LINQ に示す必要があります。AsEnumerable()を呼び出すと、クライアントで残りの処理を実行できます。 . ただし、サーバーにできるだけ多くのことをさせることをお勧めします。

于 2008-12-16T06:30:47.073 に答える
0

私の VB はかなり悪いですが、これが本来あるべき姿だと思います。これは、CalcValues が double を返し、型rowsが RowClass であることを前提としています。この例では、OrderBy 拡張機能の IComparer バージョンを使用しませんが、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 のラムダ式

于 2008-12-16T03:45:20.887 に答える
0

私の解決策:

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

これにより、ゼロ除算の例外もキャッチされます

于 2008-12-17T06:36:19.980 に答える