我需要从一个表中选择一些“主”行,同时为每个结果返回另一个表中的一些详细行。在没有多个查询的情况下实现这一目标的好方法是什么(一个用于主行,一个用于每个结果以获取详细信息行)。
例如,数据库结构如下:
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 :
// 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 个查询 - 每个主行有一个主列表和一个子列表。
关于c# - 查询嵌套数据的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/316967/