2011-11-11 20 views
1

我正在尝试制定一个LINQ查询来从列表中提取项目,列表包含子项目列表 - 我需要查询项目,然后使用结果我最后一种记录中的项目返回了查询。使用子查询对Linq结果进行升序然后降序

的父母是表(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) 

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

.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(按降序排列),然后排序计数器升序排列

这是我的失败尝试:

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) 

我尝试不工作,我收到以下错误:

at least on object must implement IComparable

任何人都可以看到需要做,以实现我的目标是什么?

回答

1

在阅读你的代码有点接近,我发现您通过收养

订购我觉得这你真的想

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 
+0

感谢您的建议。我对Linq还是比较新的,所以我会研究这些建议。如果你知道任何好的例子,我很乐意看到它们。再次感谢。 – Ben

+0

@Ben:用你想要的东西替换我的答案。请注意,我现在假设您想按照广告的最高优先级进行排序(因为它可以有多个AdOptions) – sehe

+0

我试图让我的头绕着你的答案(试图快速学习)。我想你已经明白了。 – Ben

相关问题