[英]How to group linq query by dynamic items
我有一個分組的linq查詢,按類別對項目進行分組,然后是該類別中的位置:
var categories = db.Items.GroupBy(p => p.Category).
Select(group =>
new
{
name = group.Key,
data = new List<int>()
{
group.Count(p => p.City == "Sydney"),
group.Count(p => p.City == "Melbourne"),
group.Count(p => p.City == "Brisbane"),
group.Count(p => p.City == "Perth"),
group.Count(p => p.City == "Canberra"),
},
total = group.Count()
});
正如您所看到的,我正在對位置進行硬編碼以獲取某個類別中每個位置的計數。 我不想硬編碼這個,因為位置分別存儲在數據庫中,有沒有辦法可以修改查詢以便計數是動態的? 例如,對於db.locations中的所有內容?
您可以使用另一個GroupBy。
var categories = db.Items.GroupBy(p => p.Category).Select(group =>
new
{
Name = group.Key,
Data = group.GroupBy(g => g.City),
Total = group.Count()
});
你也可以在里面有另一個匿名類型。
var categories = db.Items.GroupBy(p => p.Category).Select(group =>
new
{
Name = group.Key,
Data = group.GroupBy(g => g.City).Select(c =>
new
{
CityName = c.Key,
Count = c.Count()
}),
Total = group.Count()
});
以下是如何使用它。 如果你感到困惑
foreach(var category in categories)
{
var name = category.Name;
var data = category.Data;
var total = category.Total;
foreach(var location in data)
{
var cityname = location.CityName;
var count = location.Count;
}
}
請注意,如果要將此查詢作為參數傳遞給其他位置,則必須使用dynamic
關鍵字而不是var
。
var
會很快。 但是dynamic
很慢所以在這種情況下,我建議你編寫自定義類來保存數據,而不是使用匿名類型。
var categories = db.Items.GroupBy(p => p.Category).
Select(group =>
new
{
name = group.Key,
data = new List<int>()
{
group.Count(p => p.City == db.locations.select(loc=>loc.ToString()).ToString()),
},
total = group.Count()
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.