繁体   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