Zagnieżdżona Grupa przez LINQ
Nie jestem w stanie rozwiązać tego problemu za pomocą zapytania LINQ.
Mamy więc następującą strukturę tabeli: Id / / bug_category || bug_name || bug_details / / bug_priority
Chcę najpierw pogrupować według bug_category. Dla każdego bug_category chcę z kolei pogrupować według priorytetu bug__.
Więc w zasadzie chcę coś takiego:
Bug_category = AUDIO:: No of BUGS --> Critical = 3, Medium = 2 and Low = 7 bugs.
bug_category = VIDEO:: No of BUGS --> Krytyczne = 5, Średnie = 1 i niskie = 9 błędów.
Poniższe zapytanie zwraca wszystkie unikalne kombinacje category I customer_priority:
(Gdzie RawDataList jest po prostu listą danych o wyżej wymienionej strukturze )
var ProceesedData = from d in RawDataList
group d by new { d.bug_category, d.bug_priority } into g
select new
{
g.Key.bug_category,
g.Key.bug_priority
};
Poniższe zapytanie zwraca kategorię, po której następuje lista rekordów w tej kategorii:
var ProceesedData = from d in RawDataList
group d by d.bug_category into g
select new { g.Key, records = g
};
Ale nie jestem w stanie przejść dalej, ponieważ ProcessedData(zmienna zwrotna) jest nieznanym typem. Jakieś pomysły na ten temat?
4 answers
Podejrzewam, że chcesz (nazwy zmienione na bardziej idiomatyczne):
var query = from bug in RawListData
group bug by new { bug.Category, bug.Priority } into grouped
select new {
Category = grouped.Key.Category,
Priority = grouped.Key.Priority,
Count = grouped.Count()
};
Wtedy:
foreach (var result in query)
{
Console.WriteLine("{0} - {1} - {2}",
result.Category, result.Priority, result.Count);
}
Alternatywnie (ale patrz później):
var query = from bug in RawListData
group bug by new bug.Category into grouped
select new {
Category = grouped.Category,
Counts = from bug in grouped
group bug by grouped.Priority into g2
select new { Priority = g2.Key, Count = g2.Count() }
};
foreach (var result in query)
{
Console.WriteLine("{0}: ", result.Category);
foreach (var subresult in result.Counts)
{
Console.WriteLine(" {0}: {1}", subresult.Priority, subresult.Count);
}
}
EDIT: jak zaznaczono w komentarzach, spowoduje to wysłanie wielu zapytań SQL. Aby uzyskać podobną strukturę wyników, ale bardziej efektywnie można użyć:
var dbQuery = from bug in RawListData
group bug by new { bug.Category, bug.Priority } into grouped
select new {
Category = grouped.Key.Category,
Priority = grouped.Key.Priority,
Count = grouped.Count()
};
var query = dbQuery.ToLookup(result => result.Category,
result => new { result.Priority, result.Count };
foreach (var result in query)
{
Console.WriteLine("{0}: ", result.Key);
foreach (var subresult in result)
{
Console.WriteLine(" {0}: {1}", subresult.Priority, subresult.Count);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 07:10:46
Jest to łatwiejszy sposób na wykonanie zagnieżdżonych grup. Przetestowałem go w kolekcjach pamięci, czy twój konkretny dostawca DB poradzi sobie z tym dobrze, może się różnić, lub czy działa dobrze jest nieznany.
Zakładając, że masz dwie właściwości i chcesz pogrupować według stanu i kraju:
var grouped = People
.GroupBy(l => new { l.State, l.Country})//group by two things
.GroupBy(l=> l.Key.Country)//this will become the outer grouping
foreach(var country in grouped)
{
foreach(var state in country)
{
foreach(var personInState in state)
{
string description = $"Name: {personInState.Name}, State: {state.StateCode}, Country: {country.CountryCode}";
...
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-31 15:33:39
Myślę, że szukasz czegoś takiego:
var processedData =
rawData.GroupBy(bugs => bugs.bug_category,
(category, elements) =>
new
{
Category = category,
Bugs = elements.GroupBy(bugs => bugs.bug_priority,
(priority, realbugs) =>
new
{
Priority = priority,
Count = realbugs.Count()
})
});
foreach (var data in processedData)
{
Console.WriteLine(data.Category);
foreach (var element in data.Bugs)
Console.WriteLine(" " + element.Priority + " = " + element.Count);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 06:38:02
Możesz to zrobić tak
var retList = (from dbc in db.Companies
where dbc.IsVerified && dbc.SellsPCBs && !dbc.IsDeleted && !dbc.IsSpam && dbc.IsApproved
select new
{
name = dbc.CompanyName,
compID = dbc.CompanyID,
state = dbc.State,
city = dbc.City,
businessType = dbc.BusinessType
}).GroupBy(k => k.state).ToList();
List<dynamic> finalList = new List<dynamic>();
foreach (var item in retList)
{
finalList.Add(item.GroupBy(i => i.city));
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-30 06:47:47