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

标签 c# .net sql-server sql-server-2008

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

例如,数据库结构如下:

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/

相关文章:

c# - FreeImage.LoadFromStream 对 CR2 文件失败

c# - 为什么 System.Net.Mail 在我的 c#.net web 应用程序的一部分工作,但在另一部分却不行?

c# - 如何在 C# 中引用 Ghostscript DLL

c# - 从数据库生成 POCO/DTO 的工具 (SQL Server)

c# - 使用 C# 的 SendInput 模拟按键事件

c# - .NET 中快速紧凑的对象序列化

.net - "Keyset does not exist"将 SignData 函数与 RSA 一起使用时

sql-server - 从 MSSQL 中的表中获取数字范围

php - 按照给定列表中 ID 的顺序对数据进行排序

sql-server - MS SQL Server 2005 将数据从一个表复制到另一个表