2010-05-14 6 views
1

Je suis un ours de temps pour que cela fonctionne. J'ai un List(Of MyItem) appelé Items qui a une propriété OrderId sur eux. De ces éléments, je veux créer une liste de Order s. Certains articles auront le même OrderId donc je veux essayer de grouper par OrderId. Je veux ensuite trier par date. Voici ce que j'ai jusqu'à présent:VB.NET GroupBy Déclaration 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 

Ceci, bien sûr, ne compile pas, et je reçois l'erreur:

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

J'ai la partie où est indiquée en gras, je pense que le problème est, mais je n'ai aucune idée de comment le réparer. En outre, il a fonctionné correctement (sauf qu'il y avait des valeurs en double) avant d'ajouter l'instruction .GroupBy. Quelqu'un a des idées?

Merci

EDIT

Fondamentalement, je veux ceci:

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

Est-ce que les articles avec le même orderid ont la même date? –

+0

les articles n'ont pas de dates. Fondamentalement, j'utilise la liste des éléments pour saisir les OrderIds pour faire les bons ordres, mais je ne veux pas dupes. Je me sens comme je le rends plus difficile que cela doit être: \ – Jason

+0

Alors vraiment vous voulez juste une liste de commandes uniques? –

Répondre

3

Vous n'avez pas besoin d'utiliser group by pour cela.

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 

Si vous souhaitez le commander par le OrderedDate de l'ordre, il suffit d'ajouter une clause orderby avant la 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

merci! Je ne savais pas que vous pouviez juste laisser tomber un «Distinct» là-dedans. aussi, je ne savais pas que vous pouviez linq comme ça. Merci encore :) – Jason

0

En mettant l'OrderBy après la GroupBy, vous instruisez à trier les groupes. Un groupe d'ordres n'a pas de date unique. Je pense que ce que vous voulez probablement faire est de changer le OrderBy et GroupBy autour; sauf si GroupBy perd un ordre de tri antérieur, auquel cas vous devrez trier chaque groupe.

Cela ressemble aussi tort de me

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

devrait-il pas être

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

donc j'ai essayé ceci: 'Dim commandes en tant que liste (Of Order) = Items.Select (fonction (i comme MyItem) New Order (i.OrderID)). OrderBy (Fonction (o As Order) o.DateOrdered) .GroupBy (Fonction (o As Order) o.OrderID) .ToList' et a obtenu une erreur similaire à ci-dessus: Valeur de type 'System.Collections.Generic.List (Of System.Linq.Grouping (Of ** Entier **, Ordre)) 'ne peut pas être converti en' System.Collections.Generic.List (Of Order)) ' – Jason

+0

Eh bien, oui, cela ferait l'affaire. Ce que vous faites ici est d'essayer (avec la clause List()) de convertir une liste d'IGrouping en une liste d'ordre. L'entier était juste la clé de l'IGrouping.Évidemment, maintenant que vous avez édité votre question, il est clair que ce que vous essayiez de faire n'avait rien à voir avec GroupBy en premier lieu, ce qui explique à la fois nos confusions – pdr

0

je l'ai dit F et utilisé un code moins jolie:

 
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 

Si quelqu'un a un Pour le faire, je préférerais le faire de cette façon. Sinon, je suppose que ce morceau de Kludge devra faire.

+0

je suis allé avec la méthode de geoff. Je vais laisser cela ici comme une alternative à la même fin. – Jason