如何加入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作为值的答案。