簡體   English   中英

如何通過動態項目對linq查詢進行分組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM