gpt4 book ai didi

c# - 如何制作包含子对象(如 SQL 外连接)的 LINQ Select?

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:30 25 4
gpt4 key购买 nike

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

但我不确定如何添加子主题并让它在有时没有匹配的子主题的情况下工作。

最佳答案

您必须从 Topics 开始,并为 SubTopics 使用 DefaultIfEmpty。在您的情况下,这很容易,因为您具有适当的导航属性:

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

关于c# - 如何制作包含子对象(如 SQL 外连接)的 LINQ Select?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37169310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com