感谢您们提供的所有精彩答案!
我在SQL中有两个表。第一个定义了父级,具有名为ParentId的主键列。我还有一个子表,它具有一个主键和一个作为“ParentId”的外键。因此,这两个表形成一个一对多的关系。
问题是什么是以最有效的方式从C#代码中获取父项+子项数据?数据必须读入以下对象:
使用这种方法,我需要找到所有唯一的父行,然后读取所有子行。优点是只需要进行1次数据库访问。
第二种方法是分别读取所有父行:
使用LINQ将所有父项与子项合并。这种方法需要2次访问数据库。
第三种方法是最低效的,它获取所有父项,并在构建每个父对象时,访问数据库以获取其所有子项。这种方法需要n+1个连接:1个用于所有父项,n个用于获取每个父项的所有子项。
有没有更简单的方法?我不能避免使用存储过程,也不能使用LINQ2SQL或EF。您更喜欢Data Tables还是DataReaders?如果是这样,如何在第1或第2种方法中使用它们?
谢谢, 马丁
我在SQL中有两个表。第一个定义了父级,具有名为ParentId的主键列。我还有一个子表,它具有一个主键和一个作为“ParentId”的外键。因此,这两个表形成一个一对多的关系。
问题是什么是以最有效的方式从C#代码中获取父项+子项数据?数据必须读入以下对象:
public class Parent
{
public int ParentId { get; set; }
public List<Child> Children { get; set; }
// ... many more properties ... //
}
public class Child
{
public int ChildId { get; set; }
public string Description { get; set; }
// ... many more properties ... //
}
如果我使用以下查询,我将一次性获取父级和子级,其中每个父级将重复多少次就有多少个子级:
SELECT
p.ParentId as 'ParentId',
c.ChildId as 'ChildId',
-- other relevant fields --
FROM
Parents p
INNER JOIN
Children c
ON
p.ParentId = c.ParentId
使用这种方法,我需要找到所有唯一的父行,然后读取所有子行。优点是只需要进行1次数据库访问。
第二种方法是分别读取所有父行:
SELECT * FROM Parents
然后单独读取所有子元素:
SELECT * FROM Children
使用LINQ将所有父项与子项合并。这种方法需要2次访问数据库。
第三种方法是最低效的,它获取所有父项,并在构建每个父对象时,访问数据库以获取其所有子项。这种方法需要n+1个连接:1个用于所有父项,n个用于获取每个父项的所有子项。
有没有更简单的方法?我不能避免使用存储过程,也不能使用LINQ2SQL或EF。您更喜欢Data Tables还是DataReaders?如果是这样,如何在第1或第2种方法中使用它们?
谢谢, 马丁