如何加入linq的两个数组

问题描述:

我想结合两个数组与他们的关系,但不能做得很好。 我有一个职位表在我的数据库和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) 

到底如何我这样的顺序添加到列表框中

像这样的东西应该工作:

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>() 
       } 

由于您使用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作为值的答案。