VB.NET GroupBy LINQ语句

时间:2010-05-14 04:26:01

标签: vb.net linq group-by

我有一段时间让这个工作。我有一个名为List(Of MyItem)的{​​{1}},其上有Items个属性。从这些项目中,我想创建一个OrderId的列表。有些项目具有相同的Order,因此我想尝试按OrderId进行分组。然后我想按日期排序。这是我到目前为止所做的:

OrderId

当然,这不会编译,我收到错误:

  

类型'System.Collections.Generic.List(Of System.Linq.IGrouping( Of Order,Order ))'的值无法转换为'System.Collections.Generic.List(< strong> Of Order ))'

我认为问题所在的部分是粗体,但我不知道如何修复它。此外,在我添加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 语句之前,它曾经工作正常(除了有重复的值)。有人有什么想法吗?

由于

修改

基本上,我想要这个:

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

3 个答案:

答案 0 :(得分: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

之前添加orderby子句
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

答案 1 :(得分:0)

通过在GroupBy之后放置OrderBy,您指示它对组进行排序。一组订单没有单一日期。我在想你可能想要做的是切换OrderBy和GroupBy;除非GroupBy丢失任何先前的排序顺序,在这种情况下,您将必须对每个组进行排序。

这对我来说也是错误的

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

不应该

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

答案 2 :(得分:0)

我说它并使用了一些不太漂亮的代码:

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方式,我宁愿这样做。否则,我想这片kludge将不得不做。