2010-12-14 17 views
3

J'essaie de combiner deux tableaux avec leurs relations, mais ne peux pas faire exatly. J'ai une table de poteaux sur ma base de données et dans le tableau de poteaux il y a des dossiers de questions et de réponses. les réponses sont liées à la question sur la colonne "relatedPostId". ex:comment joindre deux tableaux avec linq

Posts (Table) 
------------- 
int Id (Field) 
string Text (Field) 
int RelatedPostId (Field) 

question(record) : relatedPostId column is null 
answer(record) : relatedPostId column is the value of question id 

Mon code est comme ci-dessous

var posts = DBConnection.GetComments(_post.TopicId).ToArray().OrderByDescending(p => p.CreateDate); 

    var questions = posts.Where(p => p.RelatedPostId == null); 
    var answers = posts.Where(p => p.RelatedPostId != null); 


    var result = from q in questions 
       join a in answers 
       on q.Id equals a.RelatedPostId 
       select new { q = q, a = a }; 

Je veux la liste des postes sur une zone de liste (lstCurrentTopic.Items.AddRange (...)) Je veux aussi afficher les réponses à la fin de chaque question comme

Question1 
-> Answer1 (relatedPostId is Qustion1.Id) 
-> Answer2 (relatedPostId is Qustion1.Id) 
Qestion2 
->Answer3 (relatedPostId is Qustion2.Id) 
->Anser4 (relatedPostId is Qustion2.Id) 

comment puis-je ajouter cet ordre à listBox

Répondre

5

Quelque chose comme cela devrait fonctionner:

var result = from q in questions 
      select new { 
       q, 
       answers = 
        from a in answers 
        where q.Id == a.RelatedPostId 
        select a; 
       } 

L'approche ci-dessus fonctionnerait très bien pour quelque chose comme LINQ to Entities, où elle se traduit à une instruction SQL que la base de données peut optimiser. Puisque vous utilisez LINQ à des objets, vous obtiendrez de meilleures performances si vous tirer parti des structures de données:

var answersByQuestionId = answers.ToLookup(a => a.RelatedPostId); 
var result = from q in questions 
      select new { 
       q, 
       answers = answersByQuestionId.Contains(q.Id) 
          ? answersByQuestionId[q.Id].AsEnumerable() 
          : Enumerable.Empty<Answer>() 
       } 
2

Si vous voulez que les questions qui ont des réponses que vous pouvez ensuite utiliser quelque chose comme ceci:

var result = from q in questions 
       join a in answers on q.Id equals a.RelatedPostId 
       group a by q; 

Mais si vous voulez toutes les questions, peu importe si elles ont des réponses:

var result = from q in questions 
       from a in answers.Where(x => x.RelatedPostId == q.Id).DefaultIfEmpty() 
       group a by q; 

Ces deux renvoient un IGrouping qui devrait être une structure qui wor ks pour vous (bien qu'il soit vraiment facile de le convertir en dictionnaire).

var dict = result.ToDictionary(x => x.Key, x => x.Select(y => y)); 

Le dictionnaire aura la question en tant que clé, et un IEnumerable de réponses en tant que valeur.