LINQ с groupby и количеством, плюс имя

#c# #linq

Вопрос:

Я хочу отобразить список с именами владельцев и количеством списков для каждого. Группа.Ключ дает мне идентификатор человека, но как я могу поменять его на имя?

 // Get all lists owned by an organization var lists = context.SalesToolsLists.Include(x=gt;x.OwningUserOrganization).Where(x =gt; uoids.Contains(x.OwningUserOrganization.Id));  // Get a dataset where each row contains OwningUserOrganization.FullName, group.Key and group.Count() res.UOListCounts = new Listlt;Tuplelt;int, intgt;gt;(); foreach (var listgroup in lists?.GroupBy(info =gt; info.OwningUserOrganizationId).Include(x=gt;x)  .Select(group =gt; new  {  Metric = group.Key,  Count = group.Count(),    }).OrderBy(x =gt; x.Metric)) {  res.UOListCounts.Add(new Tuplelt;int, intgt;(listgroup.Metric, listgroup.Count)); }  

Комментарии:

1. GroupBy(info =gt; new { id = info.OwningUserOrganizationId, name = info.Name}) предполагая, что имя указано в переменной info

2. Примечание (и это мое мнение), это может улучшить читаемость кода, чтобы переместить запрос из foreach в его собственную переменную.

3. Спасибо за всю помощь! gunr2171, Это правда!

Ответ №1:

Вам просто нужно сгруппировать элементы по именам, а OwningUserOrganizationId не следующим образом:

 foreach (var listgroup in lists?.GroupBy(info =gt; info.OwningUserOrganization.FullName).Include(x=gt;x)  .Select(group =gt; new  {  Metric = group.Key,  Count = group.Count(),    }).OrderBy(x =gt; x.Metric)) {  res.UOListCounts.Add(new Tuplelt;int, intgt;(listgroup.Metric, listgroup.Count)); }  

Так что group.Key это дает OwningUserOrganization.FullName

И в качестве бонуса, как отметил @gunr2171 в комментариях, вы можете переместить запрос из foreach в его собственную переменную, чтобы улучшить читаемость кода.

Комментарии:

1. Большое спасибо! Прекрасно работает!