2008-12-16 56 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(),然后你可以在客户端上做任何剩余的处理。尽管让服务器尽可能地做到更好。

相关问题