gpt4 book ai didi

c# - 如何按动态项对 linq 查询进行分组

转载 作者:太空宇宙 更新时间:2023-11-03 23:06:40 28 4
gpt4 key购买 nike

我有一个分组的 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 很慢,所以在这种情况下,我建议您编写自定义类来保存数据,而不是使用匿名类型。

关于c# - 如何按动态项对 linq 查询进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40962785/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com