2010-05-14 145 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