2010-05-14 184 views
1

我有一個時間讓這個工作。我有一個叫做ItemsList(Of MyItem),它們有一個OrderId屬性。從這些項目中,我想創建一個Order s的列表。有些項目將有相同的OrderId,所以我想嘗試按OrderId分組。然後我想按日期排序。這是我到目前爲止有:VB.NET GroupBy LINQ聲明

Public ReadOnly Property AllOrders() As List(Of Order) 
    Get 
     Return Items.Select(Function(i As MyItem) New Order(i.OrderID)) _ 
     .GroupBy(Function(o As Order) New Order(o.OrderID)) _ 
     .OrderBy(Function(o As Order) o.DateOrdered).ToList 
    End Get 
End Property 

這當然不編譯,我得到的錯誤:

Value of type 'System.Collections.Generic.List(Of System.Linq.IGrouping(Of Order, Order))' cannot be converted to 'System.Collections.Generic.List(Of Order))'

我加粗,我認爲這個問題是一部分,但我不知道如何解決它。此外,它還用於在添加.GroupBy語句之前正常工作(除了存在重複值)。有人有主意嗎?

感謝

編輯

基本上,我想這一點:

List of Existing Items  Take List and Turn it into 
List(Of MyItem):     List(Of Order): 
ItemId OrderId     OrderID 
1  100      100 
2  102      102 
3  100 
+0

不要使用相同的OrderID項具有相同日期前添加一個排序依據的條款? – 2010-05-14 04:56:21

+0

這些項目沒有日期。基本上我使用物品清單來抓取OrderIds來做出正確的訂單,但我不想要。我覺得我比它更難:\ – Jason 2010-05-14 04:59:40

+0

所以你真的想要一個獨特的orderids列表? – 2010-05-14 05:01:58

回答

3

您不需要爲此使用group by。

Public ReadOnly Property AllOrders() As List(Of Order) 
Get 
    Return Items.Select(Function(i) i.OrderID).Distinct.Select(Function(p) New Order(p)).ToList() 
End Get 
End Property 

如果你想通過OrderedDate的順序來訂購吧,只是ToList

Public ReadOnly Property AllOrders() As List(Of Order) 
Get 
    Return Items.Select(Function(i) i.OrderID).Distinct _ 
       .Select(Function(p) New Order(p)) _ 
       .OrderBy(Function(s) s.DateOrdered).ToList() 
End Get 
End Property 
+0

謝謝!不知道你可以在那裏放棄一個「獨特」。也不知道你可以這樣做。再次感謝 :) – Jason 2010-05-14 07:03:57

0

通過將排序依據的的GroupBy之後,你指示它的組進行排序。一組訂單沒有一個日期。我在想你可能想要做的是切換OrderBy和GroupBy;除非GroupBy丟失任何先前的排序順序,在這種情況下,您必須對每個組進行排序。

這也看起來我錯了

.GroupBy(Function(o As Order) New Order(o.OrderID)) 

豈不是

.GroupBy(Function(o As Order) o.OrderID) 
+0

所以我試過這個:Dim order As List(Of Order)= Items.Select(Function(i As MyItem)New Order(i.OrderID))。OrderBy(Function(o As Order)o.DateOrdered).GroupBy(Function(o As Order)o.OrderID).ToList'並且得到與上面類似的錯誤:類型'System.Collections.Generic.List(Of System.Linq.IGrouping(Of **整數**,訂單))''不能轉換爲'System.Collections.Generic.List(Of Order))' – Jason 2010-05-14 04:43:16

+0

嗯,是的,它會這樣做。你在做的是試圖(用List())子句將IGrouping列表轉換爲Order列表。 Integer只是IGrouping的關鍵。很明顯,現在你已經編輯了你的問題,很明顯,你試圖做的事與GroupBy無關,這就解釋了我們對geoff的方法 – pdr 2010-05-14 08:06:21

0

我說F IT和使用一些不太漂亮代碼:

 
Public ReadOnly Property AllOrders() As List(Of Order) 
    Get 
     Dim ids = Items.Select(Function(i As OrderItem) i.OrderID).Distinct() 
     Dim orders As New List(Of Order) 
     For Each i As Integer In ids 
      orders.Add(New Order(i)) 
     Next 
     Return orders.OrderBy(Function(o As Order) o.DateOrdered).ToList 
    End Get 
End Property 

如果任何人有LINQier的做法,我寧願這樣做。否則,我想這塊混合物將不得不做。

+0

的困惑。我會把它留在這裏,只是爲了達到同樣的目的。 – Jason 2010-05-14 07:04:45