当前位置: 首页 > 编程语言 > C#

查询嵌套数据的高效方法分享

时间:2023-04-10 14:52:33 C#

查询嵌套数据的高效方法我需要从一个表中选择一些“主”行,并为每个结果从另一个表返回许多详细信息行。在没有多个查询的情况下实现这一目标的好方法是什么(一个用于主行,一个用于获取详细信息行)。例如,使用如下所示的数据库结构:MasterTable:-MasterIdBIGINT-NameNVARCHAR(100)DetailTable:-DetailIdBIGINT-MasterIdBIGINT-AmountMONEY如何最有效地填充下面的数据对象?我列出数据;publicclassMaster{privatereadonlyList_details=newList();公共长MasterId{得到;放;}公共字符串名称{得到;放;}publicIListDetails{get{return_details;}}}publicclassDetail{publiclongDetailId{get;放;}publicdecimalAmount{get;放;通常我会采用两种网格方法-但是,您可能还想查看FORXML-将父/子数据塑造为xml并从那里加载它非常容易(在SQLServer2005及更高版本中)。SELECTparent.*,(SELECT*FROMchildWHEREchild.parentid=parent.idFORXMLPATH('child'),TYPE)FROMparentFORXMLPATH('parent')此外–LINQ-to-SQL支持这种类型,但是你需要提前告诉它你想要什么数据。通过DataLoadOptions.LoadWith://来自MSDNNorthwnd的示例db=newNorthwnd(@"c:northwnd.mdf");DataLoadOptionsdlo=newDataLoadOptions();dlo.LoadWith(c=>c.Orders);db.LoadOptions=dlo;varlondonCustomers=fromcustindb.Customerswherecust.City=="London"selectcust;foreach(varcustObjinlondonCustomers){Console.WriteLine(custObj.CustomerID);如果您不使用LoadWith,您将获得n+1个查询-每个主行有一个主数据列表和一个子数据列表。可以通过以下单个查询来完成:从MasterTable内部选择MasterTable.MasterId、MasterTable.Name、DetailTable.DetailId、DetailTable.Amount在MasterTable.MasterId=DetailTable.MasterId上按MasterTable.MasterId顺序连接DetailTable然后在伪代码中foreach(结果中的行){if(row.MasterId!=currentMaster.MasterId){list.Add(currentMaster);currentMaster=newMaster{MasterId=row.MasterId,Name=row.Name};}currentMaster.Details.Add(newDetail{DetailId=row.DetailId,Amount=row.Amount});}list.Add(currentMaster);有一些优势可以变通,但它应该给你一般的想法。SELECTFROMmasterMSELECTJOINChildConM.Id=C.MasterID.您可以使用两个查询并在每个结果集上传递一个:查询所有按MasterId排序的master,然后查询按MasterId排序的所有master的所有订单详细信息。然后,使用两个嵌套循环,遍历主数据并在主循环中为每一行创建一个新的主对象,并在它们与当前主对象具有相同的MasterId时遍历详细信息,并在嵌套循环中填充它们的_详情收集。根据数据集的大小,您可以使用两个查询(一个用于所有主数据,一个用于所有嵌套数据)将所有数据提取到内存中的应用程序中,然后使用它以编程方式创建子列表,例如:ListallMasters=获取所有大师();列出allDetail=getAllDetail();foreach(MasterminallMasters)m.Details.Add(allDetail.FindAll(delegate(Detaild){returnd.MasterId==m.MasterId});使用这种方法,您实际上是在用内存占用换取速度。您可以很容易地调整它,以便GetAllMasters和GetAllDetail只返回您感兴趣的主项和细节项。另请注意,为了使其有效,您需要将MasterId添加到细节类这是您可能会考虑的替代方案。每个开发人员确实要花费150美元,但时间就是金钱……我们使用一个称为实体空间的对象持久层来生成代码,让您可以完全按照自己的意愿行事,并且可以在模式发生变化时重新生成代码。用数据填充对象是透明的。使用上面描述的对象看起来像这样(对不起,我的VB,但它在C#中也有效):需要了解更多C#学习教程,希望大家多多关注—DimmasterasNewBusinessObjects.Mastermaster.LoadByPrimaryKey(43)Console.PrintLine(master.Name)ForEachdetailasBusinessObjects.Detailinmaster.DetailCollectionByMasterIdConsole.PrintLine(detail.Amount)detail.Amount*=1.15EndForWithmaster.DetailCollectionByMasterId.AddNew.Amount=13EndWithmaster结束.Save()本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: