2010-08-13 7 views
0

Je suis nouveau à LINQ et j'essaye de trier celui-ci. J'essaie d'obtenir des enregistrements pour plusieurs comptes (plusieurs ID de compte) et de trier les résultats en fonction de la date. Ce que j'ai actuellement est de mettre les résultats dans une liste de sorte que plusieurs lignes/compte sont contenues dans chaque élément de la liste.Comment joindre des enregistrements dans LINQ?

Ceci est proche mais pas exactement ce que je veux. Comment puis-je retourner des résultats tels que tous les résultats (c'est-à-dire, tous les enregistrements associés à chaque compte) sont triés par date et renvoyés comme tels.

J'imagine que c'est une sorte de jointure LINQ mais je ne suis pas sûr de ce que serait la syntaxe.

public List<StatusUpdate> GetFriendStatusUpdatesByAccountId(Int32 accountId) 
     { 
      List<StatusUpdate> result; 

      List<Friend> friends = 
       _friendRepository.GetFriendsByAccountId(accountId); 

      using (WorkbookDataContext dc = _conn.GetContext()) 
      { 
       IEnumerable<StatusUpdate> statusUpdates = null; 

       foreach (Friend friend in friends) 
       { 
        Friend friend1 = friend; 

        statusUpdates = from su in dc.StatusUpdates 
            where su.AccountId == friend1.MyFriendsAccountId 
            orderby su.CreateDate descending 
            select su; 
       } 

       if (statusUpdates != null) result = statusUpdates.ToList(); 
      } 

      return result; 
     } 

Merci d'avance.

EDIT:

Merci pour votre suggestion. Je l'ai retravaillé un peu afin d'avoir accès à OrderByDescending mais ne peut pas sembler figurer le « ne peut pas résoudre le symbole » problème pour ami et su (ci-dessous en majuscules). Je me demandais si vous supposiez que "ami dans les amis" accédait à ami comme la table LINQ (qui donnerait nous l'accès à MyFriendsAccountId) et non Liste (qui ne nous donne pas directement accès à MyFriendsAccountId? En tout cas, je suis un LINQ newb donc, peut-être que je aboie le mauvais arbre En tout cas, AMI dans les amis et SU jettent le "ne peut pas résoudre symbole erreur" et j'apprécierais des suggestions.Merci une tonne pour vos commentaires ...

public List<StatusUpdate> GetFriendStatusUpdatesByAccountId(Int32 accountId) 
     { 
      List<StatusUpdate> result; 

      using (WorkbookDataContext dc = _conn.GetContext()) 
      { 
       List<Friend> friends = 
       _friendRepository.GetFriendsByAccountId(accountId); 

       IEnumerable<StatusUpdate> statusUpdates = 
        from su in dc.StatusUpdates 
        join friend in friends 
        on FRIEND.MyFriendsAccountId 
        equals SU.AccountId 
        select su; 

        result = 
         statusUpdates.OrderByDescending 
         (su => su.CreateDate).ToList(); 
      } 

      return result; 
     } 
+0

voir ma mise à jour réponse, le correctif est juste pour passer le friend.MyFriendAccountId et su.AccountId dans la clause de jointure – theburningmonk

+0

merci - cela a fait le travail. J'ai une dernière erreur avec celui-ci posté ci-dessous ... encore en train de travailler dessus. –

Répondre

1

Je suis un peu confus par ce que vous essayez de faire, votre code semble écraser les statusUpdates variable à l'intérieur du foreach boucle et par le look de celui-ci, le résultat vous obtiendrez toujours les mises à jour de statut triés pour le dernier ami dans la liste amis. Si je comprends bien votre question, vous avez une relation plusieurs-à-un entre Friend et Account ID, et chaque ami a un numéro de StatusUpdate, et vous voulez obtenir tous les StatusUpdate associés à tous les Friends qui partagent le même identifiant de compte et les ont triés par CreatedDate en descendant?

Si tel est le cas, je pense que cela pourrait être ce que vous cherchez:

public List<StatusUpdate> GetFriendStatusUpdatesByAccountId(Int32 accountId) 
{ 
    List<StatusUpdate> result; 

    List<Friend> friends = _friendRepository.GetFriendsByAccountId(accountId); 

    using (WorkbookDataContext dc = _conn.GetContext()) 
    { 
     var statusUpdates = 
      from su in dc.StatusUpdates 
      join friend in friends on su.AccountId equals friend.MyFriendsAccountId 
      select su; 

     return statusUpdates.OrderByDescending(su => su.CreateDate) 
          .ToList(); 
    } 
} 

Vous pouvez également faire la jointure en utilisant des expressions lambda, mais je préfère généralement la syntaxe de requête LINQ en matière de rejoint car ils sont plus propres.

J'espère que cela vous donnera ce que vous voulez, si vous cherchez d'autres exemples de faire des jointures dans linq, j'ai quelques exemples here.

+0

Merci beaucoup pour votre réponse. J'apprécie vraiment cela.J'ai posté mes questions de suivi ci-dessus. Merci encore! –

+0

J'ai mis à jour ma réponse, la place de l'ami et de su dans la clause de jointure doit être changée, c'est tout – theburningmonk

+0

Merci encore, je l'apprécie vraiment. Je suis actuellement aux prises avec cette erreur "La séquence locale ne peut pas être utilisée dans l'implémentation LINQ to SQL des opérateurs de requête à l'exception de l'opérateur Contains()". à cette ligne: return statusUpdates.OrderByDescending (su => su.CreateDate) .ToList(); J'essaie de comprendre et de confirmer votre réponse quand je le fais. Mais, si je ne l'ai pas fait quand vous lisez ceci et que vous savez ce qui se passe, j'apprécierais. Merci encore. –

Questions connexes