2011-11-11 55 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

相關問題