LINQ to SQL GroupBy: создание двухуровневой иерархической коллекции с одним отключением БД - PullRequest
0 голосов
/ 20 ноября 2010

Допустим, у меня есть таблица в базе данных, которая имеет три столбца: идентификатор агентства, имя и значение.

Я хочу получить коллекциюпары, сгруппированные по идентификатору агентства.

Как я могу это сделать?Я попробовал что-то вроде ниже, который работает, но делает вызов БД для каждого агентства!

from div in db.AgencyDivisionsENT
      group div by div.AgencyId into NamePairCollection
      select new KeyValuePair<int, IEnumerable<DivisionResults>>(NamePairCollection.Key,
             NamePairCollection.Select(k => new DivisionResults 
             { 
                     Name = k.Name, 
                     Value = k.Value
               ));

Я хочу закончить что-то вроде этого: IEnumerable>

Ответы [ 2 ]

2 голосов
/ 20 ноября 2010

Используя цепной синтаксис, это будет:

db.AgencyDivisionsENT
.GroupBy(x=>x.AgencyId)
.ToDictionary(x=>x.Key, g=>g.Select(x=>new { k.Name, k.Value }).ToArray());
1 голос
/ 20 ноября 2010

Самый простой способ избежать обхода с этим типом запроса - группировать на стороне клиента, вызывая .AsEnumerable ():

db.AgencyDivisionsENT
  .Select (x => new { x.AgencyId, x.Name, x.Value } )
  .AsEnumerable()
  .GroupBy(...)       // AsEnumerable() forces grouping to happen on the client 
  .ToDictionary(...)

Это ни в коем случае неэффективно, если:

  • вы выбираете только те данные, которые вам нужны, с сервера с начальным оператором .Select
  • если вам нужен оператор .Where для фильтрации данных, он помещается перед .AsEnumerable
  • вы выбираете детализацию строк (как в данном случае), а не просто агрегаты.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...