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

时间:2009-08-16 14:46:15

标签: c# sql sql-server asp.net-mvc

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

让我们称他们为“父母”和“儿童”。 “父”表在“子”表中有许多记录。 (一对多)

我的问题是我想找到一种有效的方法来显示两个表包含在我的ASP.NET MVC应用程序中的数据。我的方法是从“父”中选择所有记录,然后循环选择“儿童”中的数据。

所以我需要帮助设计SQL Server 05的查询,它可以更有效地获取C#的数据,我计划创建类型类,而“Parent”类将有一个“List”,在我的视图中我可以循环输出值。

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”
  • “Child 2”
  • “Child 3”

“家长124”

  • “儿童1”
  • “Child 2”
  • “Child 3”

4 个答案:

答案 0 :(得分:5)

我会立即提取所有数据,然后以编程方式运行它。

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

当您收到数据时,将重复父母,因此您需要将其过滤掉。您可以通过提供父比较或通过for循环通过LINQ执行此操作。 Itereate通过列表折叠在唯一的父级上,因为每条记录实际上代表一个孩子或无子女的父母。

有关LINQ“distinct”的信息是available here

答案 1 :(得分:2)

好吧,你总是可以写一个会在两个表中返回JOIN的查询:

  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连接行为)。

正如评论中指出的那样,如果您使用INNER JOIN,当然,您只会收回父母及其子女记录 - 没有孩子的父母将被排除在外。如果您也想要这些(将其子列设置为NULL),请使用LEFT OUTER JOIN而不是INNER JOIN

你的第二个选择是有一个返回两个结果的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

无论哪种方式最适合您 - 请选择!

马克

答案 2 :(得分:1)

如果您希望存储和检索分层数据,可以在单个表中执行此操作,查看SQL Server CTE表达式(CTE)。 这里有一个例子http://msdn.microsoft.com/en-us/library/ms190766.aspx

答案 3 :(得分:1)

你并没有真正清楚地提出一个问题,你刚才提到了一些想法,我认为这就是为什么有人投票但评论会很好。如果您想知道哪些SQL使用checkout Select Parent Record With All Children in SQL

,可以采用任何方式

另一种方式(由一些ORM使用)是做两个选择。一个用于所有父项,一个用于所有childeren,然后将它们连接到应用程序内存而不是数据库服务器上。