【问题标题】:Sorting IQueryable by Aggregate in VB.net在 VB.net 中按聚合对 IQueryable 进行排序
【发布时间】:2010-09-27 02:10:53
【问题描述】:

一直在寻找使用聚合值对 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

【问题讨论】:

    标签: linq sorting iqueryable


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我的 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扩展方法

      Lambda expressions 用于 Visual Basic

      【讨论】:

        【解决方案3】:

        我的解决方案:

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

        这也捕获任何除以零异常

        【讨论】:

          猜你喜欢
          • 2011-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-18
          • 1970-01-01
          • 2014-12-24
          • 2020-10-12
          相关资源
          最近更新 更多