2010-05-14 4 views
1

У меня есть медведь времени, чтобы это работало. У меня есть List(Of MyItem) под названием Items, у которых есть свойство OrderId. Из этих элементов я хочу создать список Order s. Некоторые элементы будут иметь одинаковые OrderId, поэтому я хочу попробовать сгруппировать по OrderId. Затем я хочу сортировать по дате. Вот то, что я до сих пор:VB.NET GroupBy LINQ statement

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. У кого-нибудь есть идеи?

Благодаря

EDIT

В принципе, я хочу это:

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 имеют ту же дату? –

+0

Элементы не имеют дат. в основном я использую список предметов, чтобы захватить OrderIds, чтобы делать правильные заказы, но я не хочу обманывать. Мне кажется, что я делаю это сложнее, чем это должно быть: \ – Jason

+0

Так что вам действительно нужен список уникальных заказов? –

ответ

3

Для этого вам не нужно использовать группу.

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 на заказ, просто добавьте статью OrderBy перед 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

спасибо! не знал, что вы можете просто оставить «Distinct» там. также, не знал, что вы можете это сделать. еще раз спасибо :) – Jason

0

Поставив OrderBy после GroupBy, вы поручив его отсортировать группы. Группа заказов не имеет ни одной даты. Я думаю, что вы, вероятно, хотите сделать, это переключить OrderBy и GroupBy; если GroupBy не теряет прежний порядок сортировки, и в этом случае вам придется сортировать каждую группу.

Это также выглядит неправильно меня

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

Если это не будет

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

, поэтому я попробовал это: 'Dim orders As List (Of Order) = Items.Select (Function (i As MyItem) Новый заказ (i.OrderID)) OrderBy (Функция (o As Order) oDateOrdered) .GroupBy (функция (o As Order) o.OrderID) .ToList' и получил аналогичную ошибку выше: Значение типа 'System.Collections.Generic.List (Of System.Linq.Grouping (Of ** Integer **, Order)) 'не может быть преобразован в' System.Collections.Generic.List (Of Order)) ' – Jason

+0

Ну, да, это было бы так. То, что вы делаете, пытается (с предложением List()) преобразовать список IGrouping в список порядка. Integer был всего лишь ключом к группировке.Очевидно, теперь вы отредактировали свой вопрос, ясно, что то, что вы пытались сделать, в первую очередь не имело никакого отношения к GroupBy, что объясняет и наши недоумения – pdr

0

Я сказал F это и использовали некоторые менее довольно код:

 
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

, и я пошел с методом geoff. я оставлю это здесь, как альтернатива означает тот же конец. – Jason