2010-12-14 54 views
3

我想結合兩個數組與他們的關係,但不能做得很好。 我有一個職位表在我的數據庫和Posts表中有問題和答案記錄。答案與「relatedPostId」列中的問題有關。 例如:如何加入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 

我的代碼是像下面

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 }; 

我想列出一個列表框的帖子(lstCurrentTopic.Items.AddRange(...)) 我也想在顯示答案每個問題的像

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

到底如何我這樣的順序添加到列表框中

回答

5

像這樣的東西應該工作:

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

上述方法將這樣的事情LINQ到實體,它被翻譯成一個SQL語句,該數據庫可以優化工作的偉大。如果只想有答案的問題,那麼你可以使用類似這樣

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

由於您使用LINQ的對象,你會如果你把數據結構的優勢得到更好的性能
var result = from q in questions 
       join a in answers on q.Id equals a.RelatedPostId 
       group a by q; 

但是如果你想把所有的問題,無論他們是否有答案:

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

這些都返回一個IGrouping這應該是一個結構WOR ks給你(儘管將它轉換爲字典非常簡單)。

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

該字典將問題作爲關鍵字,並將IEnumerable作爲值的答案。