LINQクエリではこの問題を解決できません。
したがって、次のようなテーブル構造になります。 bug_category ||バグ名|| bug_details || bug_priority
まず、bug_categoryでグループ化したいと思います。次に、各bug_categoryについて、bug__priorityでグループ化します。
だから基本的に私は次のようなものが欲しい:
bug_category = AUDIO ::バグ数->クリティカル= 3、中= 2、低= 7バグ。
バグ_カテゴリ=ビデオ::バグ数->クリティカル= 5、中= 1、低= 9バグ。
次のクエリは、カテゴリとcustomer_priorityのすべての一意の組み合わせを返します。
(ここでRawDataListは、上記の構造を持つデータのリストです)
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
};
以下のクエリは、カテゴリに続いてそのカテゴリのレコードのリストを返します。
var ProceesedData = from d in RawDataList
group d by d.bug_category into g
select new { g.Key, records = g
};
しかし、ProcessedData(戻り変数)は不明なタイプであるため、これ以上先に進むことができません。これについて何か考えはありますか?
私はあなたが望んでいると思います(名前はより慣用的に変更されました):
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()
};
次に:
foreach (var result in query)
{
Console.WriteLine("{0} - {1} - {2}",
result.Category, result.Priority, result.Count);
}
別の方法(ただし、後で参照):
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);
}
}
編集:コメントに記載されているように、これは複数のSQLクエリになります。同様の結果構造をより効率的に取得するには、以下を使用できます。
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);
}
}
これは、ネストされたグループ化を実現する簡単な方法です。私はそれをメモリコレクションでテストしました。特定のDBプロバイダーがそれを適切に処理するかどうかは異なります。
2つのプロパティがあり、州と国の両方でグループ化したいと仮定します。
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}";
...
}
}
}
あなたはそのようなものを探していると思います:
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);
}
このようにできます
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));
}