【问题标题】:Sorting Linq results ascending using subselect and then descending使用 subselect 对 Linq 结果进行升序然后降序排序
【发布时间】:2011-11-11 12:48:18
【问题描述】:

我正在尝试制定一个 LINQ 查询以从列表中提取项目,该列表包含一个子嵌套列表 - 我需要查询一个项目,然后在我返回的所有记录的最终排序中使用结果项目查询。

父级是List(Of MediaItems)——类结构如下:

MediaItems
 .ID (int)
 .Src (string)
 .Advert (bool)
 .AdOptions As List(Of AdvertOptions)
 .Counter (int)

AdvertOptions class consists of:
 .Age (int)
 .Gender (int)
 .Priority (int)

我想查询任何符合以下条件的 MediaItem:

.Advert = true
.Age = x (paramter in calling function)
.Gender = y (paramter in calling function)

为此,我使用以下 LINQ 查询:(年龄和性别是函数参数)

Where(Function(s) s.Advert And s.AdOptions.Any(Function(a) a.Gender = Gender And a.Age = Age))

我现在需要根据两个排序级别对结果进行排序:

AdOptions.Priority(降序),然后按Counter升序排序

这是我失败的尝试:

Where(Function(s) s.Advert And s.AdOptions.Any(Function(a) a.Gender = Gender And a.Age = Age)).OrderBy(Function(a) From p1 In a.AdOptions Where p1.Gender = Gender And p1.Age = Age Select p1.Priority).ThenByDescending(Function(s) s.Counter)

我的尝试不起作用,我收到以下错误:

至少一个对象必须实现 IComparable

任何人都知道需要做什么才能实现我的目标吗?

【问题讨论】:

    标签: vb.net linq sql-order-by


    【解决方案1】:

    仔细阅读您的代码后,我发现您是通过 AdOptions 订购的

    我认为这个是你真正想要的

    Sub Demo(ByVal gender As Integer, ByVal age As Integer)
    
        Dim items = New List(Of MediaItem)()
    
        Dim matching = Function(a) a.Gender = gender And a.Age = age
        Dim ads = items.Where(Function(s) s.Advert And s.AdOptions.Any(matching))
    
        Dim sorted = ads _
            .OrderBy(Function(a) a.AdOptions.Where(matching).Max(Function(ao) ao.Priority)) _
            .ThenByDescending(Function(s) s.Counter)
    
        ' if you really wanted a sorted list of AdOptions, you'd write
        Dim optionlist = ads.OrderByDescending(Function(s) s.Counter) _
           .SelectMany(Function(a) a.AdOptions.Where(matching).OrderBy(Function(ao) ao.Priority))
    
        ' to combine the two previous options
        Dim adsWithOptions = ads.OrderByDescending(Function(s) s.Counter) _
           .Select(Function(a) New With { _
                      .Ad = a, _
                      .Options = a.AdOptions.Where(matching) _
                          .OrderBy(Function(ao) ao.Priority) _
                })
    
    End Sub
    

    【讨论】:

    • 感谢您的建议。我对 Linq 还是很陌生,所以我会研究这些建议。如果你知道任何好的例子,我很乐意看到它们。再次感谢。
    • @Ben:用你想要的可能替换了我的答案。请注意,我现在假设您要按广告的最高优先级排序(因为它可以有多个 AdOptions)
    • 我正在努力理解您的答案(试图快速学习)。我想你已经明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    相关资源
    最近更新 更多