gpt4 book ai didi

c# - 查询嵌套数据的有效方法

转载 作者:太空狗 更新时间:2023-10-30 00:59:27 25 4
gpt4 key购买 nike

我需要从一个表中选择一些“主”行,同时为每个结果返回另一个表中的一些详细行。在没有多个查询的情况下实现这一目标的好方法是什么(一个用于主行,一个用于每个结果以获取详细信息行)。

例如,数据库结构如下:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com