Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 在VB.net中按聚合对IQueryable进行排序_Linq_Sorting_Iqueryable - Fatal编程技术网

Linq 在VB.net中按聚合对IQueryable进行排序

Linq 在VB.net中按聚合对IQueryable进行排序,linq,sorting,iqueryable,Linq,Sorting,Iqueryable,正在搜索使用聚合值对IQueryable(使用Linq到SQL)进行排序的快速示例 我基本上需要计算一些派生值(两个值之间的百分比差等),并按此对结果进行排序 i、 e 返回rows.OrderBy(函数CalcValue(s.Visitors,s.Clicks)) 我想调用一个外部函数来计算聚合。这应该实现IComparer吗?还是不可比 谢谢 [编辑] 已尝试使用: Public Class SortByCPC : Implements IComparer(Of Statistic) Pu

正在搜索使用聚合值对IQueryable(使用Linq到SQL)进行排序的快速示例

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

i、 e

返回rows.OrderBy(函数CalcValue(s.Visitors,s.Clicks))

我想调用一个外部函数来计算聚合。这应该实现IComparer吗?还是不可比

谢谢

[编辑] 已尝试使用:

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,我的VB非常糟糕,但我认为这应该是它的样子。这假设CalcValues返回一个double,并且
行的类型是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 )
以下是一些您可能会发现有用的链接

扩展方法


对于Visual Basic

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方面的工作-调用,然后您可以在客户端上执行任何剩余的处理。不过,最好让服务器尽可能多地执行操作。

我的解决方案:

Dim stats = rows.OrderBy(Function(s) If(s.Visitors > 0, s.Clicks / s.Visitors, 0))
这还捕获任何除零异常