C# 分组子群
如何将子组分组以创建大陆列表,其中每个大陆都有自己的县,每个国家都有自己的城市,如下表所示 以下是t-sql:C# 分组子群,c#,.net,linq,igrouping,nested-groups,C#,.net,Linq,Igrouping,Nested Groups,如何将子组分组以创建大陆列表,其中每个大陆都有自己的县,每个国家都有自己的城市,如下表所示 以下是t-sql: select Continent.ContinentName, Country.CountryName, City.CityName from Continent left join Country on Continent.ContinentId = Country.ContinentId left join City on Country.CountryId = City.
select Continent.ContinentName, Country.CountryName, City.CityName
from Continent
left join Country
on Continent.ContinentId = Country.ContinentId
left join City
on Country.CountryId = City.CountryId
以及t-sql的结果:
我尝试了这个方法,但它以错误的方式对数据进行分组,我需要按照上表的方式进行分组
var Result = MyRepository.GetList<GetAllCountriesAndCities>("EXEC sp_GetAllCountriesAndCities");
List<Continent> List = new List<Continent>();
var GroupedCountries = (from con in Result
group new
{
con.CityName,
}
by new
{
con.ContinentName,
con.CountryName
}
).ToList();
List<Continent> List = GroupedCountries.Select(c => new Continent()
{
ContinentName = c.Key.ContinentName,
Countries = c.Select(w => new Country()
{
CountryName = c.Key.CountryName,
Cities = c.Select(ww => new City()
{
CityName = ww.CityName
}
).ToList()
}).ToList()
}).ToList();
var Result=MyRepository.GetList(“EXEC sp_getallcountriesandcity”);
列表=新列表();
var GroupedCountries=(来自结果中的con
集团新
{
con.CityName,
}
由新
{
犯人姓名,
con.CountryName
}
).ToList();
List=GroupedCountries.Select(c=>new contricent()
{
大陆名称=c.Key.columentName,
Countries=c.Select(w=>newcountry()
{
CountryName=c.Key.CountryName,
Cities=c.Select(ww=>newcity()
{
CityName=ww.CityName
}
)托利斯先生()
})托利斯先生()
}).ToList();
您应该应用两次分组
var grouped = Result
.GroupBy(x => x.CountryName)
.GroupBy(x => x.First().ContinentName);
var final = grouped.Select(g1 => new Continent
{
ContinentName = g1.Key,
Countries = g1.Select(g2 => new Country
{
CountryName = g2.Key,
Cities = g2.Select(x => new City { CityName = x.CityName }).ToList()
}).ToList()
});
您需要按大陆、国家和城市对所有事物进行分组:
List<Continent> List = MyRepository.GetList<GetAllCountriesAndCities>("EXEC sp_GetAllCountriesAndCities")
.GroupBy(x => x.ContinentName)
.Select(g => new Continent
{
ContinentName = g.Key,
Countries = g.GroupBy(x => x.CountryName)
.Select(cg => new Country
{
CountryName = cg.Key,
Cities = cg.GroupBy(x => x.CityName)
.Select(cityG => new City { CityName = cityG.Key })
.ToList()
})
.ToList()
})
.ToList();
List List=MyRepository.GetList(“EXEC sp_getallcountriesandcity”)
.GroupBy(x=>x.name)
.选择(g=>新大陆
{
名称=g.键,
Countries=g.GroupBy(x=>x.CountryName)
.选择(cg=>新国家/地区
{
CountryName=cg.Key,
Cities=cg.GroupBy(x=>x.CityName)
.Select(cityG=>newcity{CityName=cityG.Key})
托利斯先生()
})
托利斯先生()
})
.ToList();
我知道这很古老,但我想说的是,对于每个microsoft来说,一种更简单、可读性更强的方法。虽然这是一个只有两个级别的示例,但它很可能适用于到达此页面的其他人(如我)
有关文件载于
并以一个学生对象为例
我想提一提的是,他们用于打印的方法比仅在您的大陆对象上创建快速打印功能更难它以错误的方式分组?在什么方面是错误的?我甚至没有在t-SQL中看到GroupBy。我认为您必须在第一组的投影中再次分组:
Result.GroupBy(x=>x.groupName)。选择(g=>g.GroupBy(x=>x.CountryName))
@TimSchmelter,是的。。我想像这个大陆-->国家-->City@juharr...thank非常感谢你的帮助:)。我是林克集团的。。。按sql分组是否更好?如果是,请编写简单的代码,告诉我如何做到这一点…它工作了,非常感谢:)。。。但是我不理解var grouped=Result.GroupBy(x=>x.CountryName).GroupBy(x=>x.First().groupname);你能告诉我一个更简单的分组方法吗?类似于我在代码中使用的东西。。。谢谢谢谢你,蒂姆!你总是帮助我,我的好朋友!!这正是我想要的。您如何看待使用Linq进行分组,这样可以吗?还是应该使用sql server而不是Linq进行分组?我的另一个问题是:我是一名新的开发人员,你对我成为真正专业的开发人员有什么建议:)?我花了两天时间研究如何在sql server中对其进行分组,但找不到任何有用的文章,即使在数据库中进行分组,也不会得到嵌套结构,因此您当前的方法很好。另一种方法是按大陆、国家和城市对数据库中的结果集进行排序。然后,一个简单有效的循环就足够创建您的列表了。您可以开始用您已经知道的内容帮助stckoverflow中的其他人。通过这种方式,你学到了很多,因为你必须思考这个问题,你可能会得到其他更好的答案,向你展示不同的方法。因此,将您的首选标签添加到问题过滤器中,您会立即看到新的问题,您可能会回答这些问题。嗨,蒂姆:),您能帮我解决这个问题吗?非常感谢。
var queryNestedGroups =
from con in continents
group con by con.ContinentName into newGroup1
from newGroup2 in
(from con in newGroup1
group con by con.CountryName)
group newGroup2 by newGroup1.Key;