C# C SQL父子表选择查询帮助

C# C SQL父子表选择查询帮助,c#,sql,sql-server,asp.net-mvc,C#,Sql,Sql Server,Asp.net Mvc,我有两个表要从中获取数据 让我们称他们为父母和孩子。父表在子表中有许多记录。一对多 我的问题是,我想找到一种有效的方法,将这两个表包含的数据显示到我的ASP.NET MVC应用程序中。我的方法是从父记录中选择所有记录,然后循环遍历每个记录,从子记录中选择数据 因此,我需要帮助为SQLServer05设计一个查询,以便更有效地为C获取数据。我计划创建类型类,父类将有一个列表,在我看来,我可以循环输出值 public class Parent_Type { public string Nam

我有两个表要从中获取数据

让我们称他们为父母和孩子。父表在子表中有许多记录。一对多

我的问题是,我想找到一种有效的方法,将这两个表包含的数据显示到我的ASP.NET MVC应用程序中。我的方法是从父记录中选择所有记录,然后循环遍历每个记录,从子记录中选择数据

因此,我需要帮助为SQLServer05设计一个查询,以便更有效地为C获取数据。我计划创建类型类,父类将有一个列表,在我看来,我可以循环输出值

public class Parent_Type
{
    public string Name { get; set; }
    public List<Children_Type> Children { get; set; }
}


public class Children_Type
{
    public string Name { get; set; }
}
数据需要显示为:父记录的名称,然后是子记录的列表

父母123

儿童1 儿童2 儿童3 父母124

儿童1 儿童2 儿童3
如果您希望存储和检索其体系结构数据,可以在单个表中执行此操作,请查看SQL Server CTE表达式CTE。
这里有一个例子

你没有真正明确地提出一个问题,你只是提到了一些想法,我想这就是为什么有人投了反对票,但如果有人发表评论就好了。如果您想知道使用什么样的SQL签出,有什么方法吗


一些ORM使用的另一种方法是进行两次选择。一个用于所有父级,一个用于所有子级,然后将它们加入到应用程序内存中,而不是数据库服务器上

好的,您总是可以编写一个查询来返回两个表之间的连接:

  SELECT Parent.ID, Parent.Field2, Parent.Field3,
         Child.ID, Child.Value2, Child.Value3
  FROM
     Parent
  INNER JOIN (or: LEFT OUTER JOIN)
     Child ON Parent.ID = Child.ParentID
但在本例中,您将得到一个平坦的行集,其中父元素的值对其每个子元素都重复,这显然是标准的SQL连接行为

正如评论中指出的那样,如果使用内部连接,当然,您只能返回父母及其子女记录,没有子女的父母将被排除在外。如果您也希望这些列的子列设置为NULL,请使用左外部联接而不是内部联接

第二种选择是使用一个ADO.NET查询返回两个结果,基本上类似于

 SELECT Parent.ID, Parent.FIeld2, Parent.Field3 ;
 SELECT Child.ID, Child.ParentID, Child.Value2, Child.Value3;
但是接下来您需要解析响应中的两个结果集,将子记录与其各自的父记录关联,并做更多的工作

第三种选择是在SQL Server中创建一个FOR XML查询,该查询将返回一个XML文档表示,即单个XML文档中父记录和子记录的层次结构

SELECT
    Parent.ID, Parent.Field2, Parent.Field3,
    (SELECT 
       Child.ID, Child.Value2, Child.Value3
     FROM Child
     WHERE ParentID = Parent.ID FOR XML AUTO, TYPE, ELEMENTS)
FROM
    Parent
FOR XML 
    AUTO, ROOT('Root'), ELEMENTS
无论哪一个最适合你-你挑吧


Marc

我会一次提取所有数据,然后以编程方式运行

SELECT Parent.Id, Parent.Name FROM Parent 
LEFT OUTER JOIN
SELECT Child.Id AS ChildId, Child.Name AS ChildName FROM Child
ON
Child.ParentId = Parent.Id
ORDER BY Parent.Name
当你取回数据时,父项将被重复,因此你需要对其进行筛选。您可以通过LINQ提供父级比较或通过for循环来实现这一点。i通过在唯一父级上折叠的列表创建,因为每个记录实际上都表示一个子级或无子级父级


关于LINQ的独特性的信息是。

我认为这是一个合理的问题,有人给了它一个负号。我的想法是,必须有一种更好的方法,而不是从父项中选择所有记录,然后在循环中查询子项表以获取详细信息。内部联接假设父项总是有子项。我应该补充一点,考虑到提出的要求,这是一种同样有效的方法。是的,两者都是可能的-这取决于通常的情况!:-关于实际需求,OP在这一点上太模糊了。谢谢,这似乎是一个合理的方法。解决方案使用了一些逻辑实现,工作非常出色。现在对代码感觉好多了:谢谢!