我的数据库中有两个SQL表。在这里,它们表示为C#类:
public class Topic
{
public Topic()
{
this.SubTopics = new HashSet<SubTopic>();
}
public int TopicId { get; set; }
public string Name { get; set; }
public int Number { get; set; }
public virtual ICollection<SubTopic> SubTopics { get; set; }
}
public class SubTopic
{
public int SubTopicId { get; set; }
public int TopicId { get; set; }
public string Name { get; set; }
public virtual Topic Topic { get; set; }
}
我创建了以下代码以获得一个简单的列表:
var result = db.SubTopics
.Select(s => new
{
TopicId = s.TopicId,
SubTopicId = s.SubTopicId,
TopicName = s.Topic.Name,
SubTopicName = s.Name
})
.ToListAsync();
结果在这里,但只有在每个主题都有一个子主题时,它才有效:
Topic1 SubTopic1 abc def
Topic1 SubTopic2 ghi jkl
Topic2 SubTopic3 mno pqr
Topic3 SubTopic4 stu vwx
Topic3 SubTopic5 xxx yyy
在没有每个主题都有子主题的情况下,我希望得到如下结果:
Topic1 SubTopic1 abc def
Topic1 SubTopic2 ghi jkl
Topic2 null mno null
Topic3 SubTopic4 stu vwx
Topic3 SubTopic5 xxx yyy
如果根本没有子主题,则返回以下结果:
Topic1 null abc null
Topic2 null mno null
Topic3 null stu null
有人可以给我一些建议,我如何使用LINQ来获得它。我认为我首先需要这样定位:
var result = db.Topics
但是我不确定如何添加SubTopics并使其适用于有时没有匹配的SubTopics的情况。
最佳答案
您必须从Topics
开始并将DefaultIfEmpty
用于SubTopics
。就您而言,这很容易,因为您具有适当的导航属性:
var result = (from t in db.Topics
from s in t.SubTopics.DefaultIfEmpty()
select new
{
TopicId = t.TopicId,
SubTopicId = (int?)s.SubTopicId,
TopicName = t.Name,
SubTopicName = s.Name
})
.ToListAsync();