我需要从表中选择许多“主”行,同时还为每个结果返回另一个表中的许多详细行。在没有多个查询的情况下实现这一目标的好方法是什么(一个用于主行,一个用于每个结果以获取详细行)。
例如,数据库结构如下:
MasterTable:
- MasterId BIGINT
- Name NVARCHAR(100)
DetailTable:
- DetailId BIGINT
- MasterId BIGINT
- Amount MONEY
我如何最有效地填充data
下面的对象?
IList<MasterDetail> data;
public class Master
{
private readonly List<Detail> _details = new List<Detail>();
public long MasterId
{
get; set;
}
public string Name
{
get; set;
}
public IList<Detail> Details
{
get
{
return _details;
}
}
}
public class Detail
{
public long DetailId
{
get; set;
}
public decimal Amount
{
get; set;
}
}
通常情况下,我会采用两个网格方法 - 但是,您可能还想看看 FOR XML - 将父/子数据塑造为 xml 并从中加载它相当容易(在 SQL Server 2005 及更高版本中)那里。
SELECT parent.*,
(SELECT * FROM child
WHERE child.parentid = parent.id FOR XML PATH('child'), TYPE)
FROM parent
FOR XML PATH('parent')
另外 - LINQ-to-SQL 支持这种类型的模型,但您需要提前告诉它您想要哪些数据。通过DataLoadOptions.LoadWith http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.loadwith.aspx:
// sample from MSDN
Northwnd db = new Northwnd(@"c:\northwnd.mdf");
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Customer>(c => c.Orders);
db.LoadOptions = dlo;
var londonCustomers =
from cust in db.Customers
where cust.City == "London"
select cust;
foreach (var custObj in londonCustomers)
{
Console.WriteLine(custObj.CustomerID);
}
如果你不使用LoadWith
,您将获得 n+1 个查询 - 一个主列表,每个主行一个子列表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)