2008-12-16 36 views
2

一直在搜索使用聚合值對IQueryable進行排序(使用Linq To SQL)的快速示例。通過VB.net中的聚合對IQueryable進行排序

我基本上需要計算幾個派生值(兩個值之間的百分比差異等),並通過這個結果排序。

返回rows.OrderBy(功能(S)CalcValue(s.Visitors,s.Clicks))

我想調用外部函數來計算聚合。這應該實現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

不喜歡我

回答

0

我的解決辦法:

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

這也捕捉由零個異常任何鴻溝

0

我的VB是很糟糕,但我認爲這是它應該是什麼樣子。這假設CalcValues返回一個double,並且rows的類型是RowClass。此示例不使用OrderBy擴展的IComparer版本,但依賴於雙精度已經可比較的事實,並返回CalcValue(假定爲雙精度)作爲鍵。

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

return rows.OrderBy(keySelector) 

以下是一些您可能會覺得有用的鏈接。

IQueryable.OrderBy擴展方法

Lambda expressions爲Visual Basic

+0

我不能讓這對LINQ工作要SQL的IQueryable – 2008-12-16 03:55:41

2

的LINQ to SQL是永遠不會喜歡你使用一個查詢中自己的方法 - 它不能看到裏面他們制定出你想要的是什麼SQL看起來像。它只能查看內部表達式樹,從查詢中的lambda表達式構建而成。

你想要的是一樣的東西:

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

如果你真的想獲取所有結果,然後命令他們,你需要告訴LINQ,你是「完成」與IQueryable的方的東西 - 打電話AsEnumerable(),然後你可以在客戶端上做任何剩餘的處理。儘管讓服務器儘可能地做到更好。

相關問題