2

一直在寻找使用聚合值对 IQueryable(使用 Linq To SQL)进行排序的快速示例。

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

IE

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

4

3 回答 3

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()然后你可以在客户端上进行任何剩余的处理. 最好让服务器尽可能多地做。

于 2008-12-16T06:30:47.073 回答
0

我的VB很糟糕,但我认为这应该是它的样子。这假定 CalcValues 返回一个双精度值并且类型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扩展方法

Visual Basic 的Lambda 表达式

于 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 回答