У меня есть следующие объекты. Агент IEnumerable <Agency
> , который затем содержит BusinessUnits и BusinessUnits, содержит клиентов:
public class Agency
{
public int ID;
public IEnumerable<BusinessUnit> BusinessUnits;
}
public class BusinessUnit
{
public string Name;
public int ID;
public decimal AmountSpent;
public IEnumerable<Client> Clients;
}
public class Client
{
public string Name;
public int ID;
public decimal AmountSpent;
}
Я использую этот запрос для консолидации своих BusinessUnits под агентствами, поэтому я могу отобразить "Все агентства": мои данные идут отсюда:
Agency1
++BusinessUnit1 - $20
++++Client1 - $10
++++Client2 - $10
Agency2
++BusinessUnit2 - $20
++++Client1 - $20
Agency3
++BusinessUnit1 - $10
++++Client5 - $5
++++Client6 - $5
++BusinessUnit2 - $25
++++Client1 - $25
:
All Agencies
++BusinessUnit1 - $30
++++Client1 - $10
++++Client2 - $10
++++Client5 - $5
++++Client6 - $5
++BusinessUnit2 - $45
++++Client1 - $20
++++Client1 - $25
Я использую следующий запрос LINQ для этого:
var groupings =
from agency in agencies
from businessUnit in agency.BusinessUnits
from client in businessUnit.Clients
group client by businessUnit.ID into clients
select clients;
var businessUnits =
from grouping in groupings
select new
{
ID = grouping.Key,
AmountSpent = grouping.Sum(client => client.AmountSpent),
Clients = grouping
};
Console.WriteLine("All Agencies");
foreach (var businessUnit in businessUnits)
{
Console.WriteLine("++BusinessUnit{0} - ${1}",
businessUnit.ID,
businessUnit.AmountSpent);
foreach (var client in businessUnit.Clients)
{
Console.WriteLine("++++Client{0} - ${1}", client.ID, client.AmountSpent);
}
}
Мой вопрос: как включить в возвращаемые объекты поля BusinessUnit и Client "Name". На данный момент мои итоговые BusinessUnits содержат только свой идентификатор, который они получают от ключа группировки.
Мне также нужно вернуть "Имя" из BusinessUnit в моем запросе, а не только его идентификатор. Я не уверен, как это сделать с LINQ в сочетании с Groupings.
Вы можете изменить ключ группировки - это предполагает, что не будет нескольких имен для одного и того же ID или наоборот:
var groupings =
from agency in agencies
from businessUnit in agency.BusinessUnits
from client in businessUnit.Clients
group client by new { businessUnit.ID, businessUnit.Name } into clients
select clients;
var businessUnits =
from grouping in groupings
select new
{
ID = grouping.Key.ID,
Name = grouping.Key.Name,
AmountSpent = grouping.Sum(client => client.AmountSpent),
Clients = grouping
};