在VB.net中通过Aggregate排序IQueryable

时间:2008-12-16 03:37:58

标签: linq sorting iqueryable

一直在搜索使用Aggregate值排序IQueryable(使用Linq To SQL)的快速示例。

我基本上需要计算一些派生值(两个值之间的百分比差等)并按此排序结果。

return rows.OrderBy(Function(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

3 个答案:

答案 0 :(得分: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()然后你可以做任何事情在客户端上剩余的处理。尽管如此,最好让服务器尽可能地做。

答案 1 :(得分:0)

我的VB非常糟糕,但我认为这应该是它的样子。这假设CalcValues返回一个double,rows的类型是RowClass。此示例不使用OrderBy扩展的IComparer版本,但依赖于双精度已经相当的事实并返回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的

Lambda expressions

答案 2 :(得分:0)

我的解决方案:

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

这也可以除以零除外