Linq:OrderBy多个字段的总和

时间:2011-01-17 21:30:17

标签: .net linq-to-sql lambda sql-order-by

我正在尝试创建一个linq表达式,我可以计算事件注释的数量以及SUM的投票数量。这就是我所拥有的,但我没有得到适当的结果。

我的例子是在VB.Net中完成的,但我也可以处理C#中的例子。

    Public Function GetHotEvents(ByVal skip As Integer) As List(Of Domain.Event) Implements IEventService.GetHotEvents
        ''# Our order by sequence just takes the number of votes and multiplies
        ''# it by two. Then takes the number of comments and adds it to the
        ''# vote count.  This way up-voted events will climb to the top while
        ''# down-voted events will fall to the bottom.  Comments also add to
        ''# the "hotness" of the event.
        Return _EventRepository.Read() _
            .Where(Function(e) e.EventDate >= Date.Today) _
            .OrderBy(Function(e) (((e.EventVotes.Sum(Function(s) s.Vote)) * 2) + (e.Comments.Count))) _
            .Skip(skip) _
            .Take(5) _
            .ToList()
    End Function

我为测试这一点所做的是对所有事件都有ZERO评论,并且upvote ONE事件。那个事件“应该”漂浮到顶部,但它不存在。

非常感谢任何帮助。

修改

我已经尝试在LinqPad中构建表达式,但不幸的是它抛出了一个错误(注意:我的代码中没有抛出此错误)

  

重载解析失败,因为没有   可以调用可访问的“OrderBy”   有了这些论点:       扩展方法'Public Function OrderBy(Of TKey)(keySelector As   System.Linq.Expressions.Expression(中   System.Func(Of LINQPad.User.Events,   TKey)))作为   System.Linq.IOrderedQueryable(中   LINQPad.User.Events)'定义于   'System.Linq.Queryable':'评论'是   不是'LINQPad.User.Events'的成员。       扩展方法'Public Function OrderBy(Of TKey)(keySelector As   System.Linq.Expressions.Expression(中   System.Func(Of LINQPad.User.Events,   TKey)))作为   System.Linq.IOrderedQueryable(中   LINQPad.User.Events)'定义于   'System.Linq.Queryable':数据类型   类型参数不能   从这些论点中推断出来。   明确指定数据类型   可能会纠正此错误。       扩展方法'Public Function OrderBy(Of TKey)(keySelector As   System.Func(Of LINQPad.User.Events,   TKey))作为   System.Linq.IOrderedEnumerable(中   LINQPad.User.Events)'定义于   'System.Linq.Enumerable':'评论'   不是会员   'LINQPad.User.Events'。       扩展方法'Public Function OrderBy(Of TKey)(keySelector As   System.Func(Of LINQPad.User.Events,   TKey))作为   System.Linq.IOrderedEnumerable(中   LINQPad.User.Events)'定义于   'System.Linq.Enumerable':数据类型   类型参数不能   从这些论点中推断出来。   明确指定数据类型   可能会纠正此错误。

编辑2

这是生成的SQL

DECLARE @p0 Int = 2    

SELECT *
FROM [dbo].[Events] AS [t0]
ORDER BY (((
    SELECT SUM([t1].[Vote])
    FROM [dbo].[EventVotes] AS [t1]
    WHERE [t1].[EventID] = [t0].[ID]
    )) * @p0) + ((
    SELECT COUNT(*)
    FROM [dbo].[Comments] AS [t2]
    WHERE [t2].[EventID] = [t0].[ID]
    ))

1 个答案:

答案 0 :(得分:2)

您的意思是OrderByDescending吗? ;)