一直在搜索使用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
答案 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 )
以下是一些您可能会觉得有用的链接。
Visual Basic的答案 2 :(得分:0)
我的解决方案:
Dim stats = rows.OrderBy(Function(s) If(s.Visitors > 0, s.Clicks / s.Visitors, 0))
这也可以除以零除外