Как я могу добавить дополнительный элемент в этот запрос LINQ?

2

У меня есть следующие объекты. Агент 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.

  • 0
    Все зависит от того, откуда поступают данные, но вот идея: вы можете подумать о реструктуризации вашего текущего дизайна класса, так как он включает в себя повторяющуюся информацию (имена, возможно, в будущем). Как насчет избавления от коллекций и AmountSpent для каждого класса и добавления нового класса, такого как Expenditures (или что-то более подходящее)? Это может содержать ссылку на агентство, BusinessUnit и клиента, участвующего для каждого, а также AmountSpent. Этот подход должен упростить запросы и группирование, но может вызвать другие проблемы, о которых я не знаю в вашем приложении.
Теги:
linq
linq-to-objects

1 ответ

3
Лучший ответ

Вы можете изменить ключ группировки - это предполагает, что не будет нескольких имен для одного и того же 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
    };
  • 0
    @ Джон Скит, что если класс BusinessUnit будет расти, чтобы содержать другие поля? Можно ли добавить их в ключ?
  • 0
    Это зависит от того, влияют ли дополнительные данные на уникальность.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню