【问题标题】:LINQ To SQL - What is the most efficient way to loop through master/detail?LINQ To SQL - 循环主/详细信息的最有效方法是什么?
【发布时间】:2013-12-18 04:33:33
【问题描述】:
在处理 master/detail 和 LINQ 时,我唯一能找到的就是通过数据绑定。但是,我使用 LINQ 来查询我的数据,并且需要手动循环遍历结果而不需要数据绑定。我的最终意图是遍历主结果集,获取分组的子列表,并将主/详细数据作为 XML 中的层次结构输出。
我的插图:我有一个名为 my_master_tbl 的表,它将按日期查询。我有一个名为 my_child_tbl 的子表,它将按日期、主 ID 分组,并使用 sum() 来汇总一些字段。我想将分组数据链接到主数据,并以最有效的方式循环通过主/详细信息,以将结果导出为 xml。那是什么方法?我能想到的唯一办法就是遍历master,然后根据master_id查询children的分组结果集。
【问题讨论】:
标签:
loops
linq-to-sql
master-detail
【解决方案1】:
我建议将其作为返回结果集的存储过程或作为获取所有主数据的查询和获取所有子数据的另一个查询来执行。这样你就可以拥有它了。然后,当您遍历主数据时,您已经拥有所有子数据。然后,您可以按当前主 ID 对所有子数据进行服务器端过滤...并遍历所有子数据。
如果您需要这样做,这个概念也适用于分页,因为您只获取在给定迭代中需要处理的主数据和子数据。
【解决方案2】:
我将使用 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>
我确定您需要根据您计划使用的布局对此进行一些更改,但希望它会给您一些想法。
这还假设您的关系是在您的主表和子表之间建立的。如果不是,则需要进行一些其他更改。