LINQ to SQL - 循环主/详细信息的最有效方法是什么?

时间:2009-07-14 14:58:59

标签: loops linq-to-sql master-detail

在处理master / detail和LINQ时,我唯一能找到的就是通过数据绑定。但是,我使用LINQ来查询我的数据,并且需要手动循环遍历结果而无需数据绑定。我的最终目的是遍历主结果集,获取子组的分组列表,并将主/详细数据输出为XML中的hierchial结构。

我的插图:我有一个名为my_master_tbl的表格,它将按日期查询。我有一个名为my_child_tbl的子表,它将按日期按主ID分组,并使用sum()来累计某些字段。我想将分组数据链接到主服务器,并以最有效的方式遍历主服务器/详细信息,以将结果导出为xml。那是什么意思?我能想到的唯一方法是遍历master,然后根据master_id查询子组的分组结果集。

2 个答案:

答案 0 :(得分:1)

我建议将此作为返回结果集的存储过程,或者作为获取所有主数据的查询以及获取所有子数据的另一个查询。这样你就可以拿到它。然后,当您遍历主数据时,您已经掌握了所有子数据。然后,您可以通过当前主ID对所有子数据进行服务器端过滤...并遍历所有子数据。

如果您需要这样做,这个概念也适用于分页,因为您只获得了在给定迭代中需要使用的主数据和子数据量。

答案 1 :(得分:0)

我会使用LinqToSql和LinqToXml的组合来实现它,类似于以下内容:

var query = new XDocument(
    new XElement("Results", from i in context.my_master_tbl
                            where i.ItemDate > DateTime.Now.AddDays(-7)
                            select new XElement("MasterItem",
                                new XAttribute("MasterName", i.Name),
                                 from c in i.my_child_tbl
                                 group c by c.Date into g
                                 select new XElement("Child",
                                     new XAttribute("Date", g.Key),
                                     new XAttribute("SumField", g.Sum(d => d.FieldToSum))
                                 )
                            )));

以下是生成的Xml:

<Results>
 <MasterItem MasterName="A">
  <Child Date="2009-01-15T00:00:00-06:00" SumField="491470" />
 </MasterItem>
 <MasterItem MasterName="B">
  <Child Date="2009-01-29T00:00:00-06:00" SumField="491526" />
 </MasterItem>
 <MasterItem MasterName="C">
  <Child Date="2009-01-15T00:00:00-06:00" SumField="1965960" />
  <Child Date="2009-07-14T00:00:00-05:00" SumField="-27" />
 </MasterItem>
 <MasterItem MasterName="D" />
 <MasterItem MasterName="E" />
</Results>

我确定您需要根据您计划使用的布局对此进行一些更改,但希望它能为您提供一些想法。

这也假设您在主表和子表之间建立了关系。如果不是,则需要进行一些其他更改。