#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})
предполагая, что имя указано в переменной info2. Примечание (и это мое мнение), это может улучшить читаемость кода, чтобы переместить запрос из 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. Большое спасибо! Прекрасно работает!