我的数据库中有两个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();

10-08 01:50