Как правило, я бы пошел на подход с двумя сетками - однако, вы также можете взглянуть на FOR XML - довольно просто (в SQL Server 2005 и выше) сформировать родительские / дочерние данные как xml, загрузить его оттуда.
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 запросов - один мастер и один дочерний список на строку мастера.