LINQ Запрос помощи
-
20-09-2019 - |
Вопрос
Я пытаюсь написать запрос LINQ, который использует несколько таблиц связанных данных и застрял.
Ожидаемый результат: мне нужно вернуть три самых густонаселенных столичных районах на регион с помощью населения.
Таблицы с примером данных:
Metroareas - ID, имя
2, Большой Нью -Йорк
Города - ID, Имя, Гостидд
1293912, Нью -Йорк, 10
CityPopulations - Id, CityId, Censusyear, население
20, 1293912, 2008, 123456789
21, 1293912, 2007, 123454321
Метроации - Id, CityId, Metroareaid
1, 1293912, 2
Государства - ID, имя, региональное
10, Нью -Йорк, 5
Регионы - ID, имя
5, северо -восток
Я начинаю с областей метро. Присоединяйтесь к метроочести, чтобы получить городские удостоверения личности. Присоединяйтесь к городам, чтобы получить идентификаторы штатов. Присоединяйтесь к государствам, чтобы получить идентификатор региона. Присоединяйтесь к регионам, чтобы я мог фильтровать с где. Я застрял, когда пытаюсь включить CityPopulation. Я хочу только три самых густонаселенных района метро для данного региона. Простое присоединение к CityPopulations возвращает рекорд в год.
(Вот что у меня есть до сих пор, этот запрос был написан для дозвуковой 3):
return from p in GeoMetroArea.All()
join q in GeoMetroAreaCity.All() on p.ID equals q.MetroAreaID
join r in GeoCity.All() on q.CityID equals r.ID
join s in GeoState.All() on r.StateID equals s.ID
join t in GeoRegion.All() on s.RegionID equals t.ID
where t.ID == regionObjectPassedToMethod.ID
select p;
Может ли кто -нибудь помочь мне с этим запросом или указать мне в правильном направлении? Огромное спасибо.
Решение
Я не собрал это, но это должно приблизиться:
var regionID = 5;
var year = (from c in GeoCityPopulation.All()
select c.CensusYear
).Max();
var metros =
// States in Region
from s in GeoStateAll()
where s.RegionID == regionID
// Cities in State
join c in GeoCity.All() on s.CityID equals c.ID
// Metro Area for City
join mc in GeoMetroAreaCity.All() on c.ID equals mc.CityID
// Population for City
join cp in GeoCityPopulation.All() on c.ID equals cp.CityID
where cp.CensusYear = year
// Group the population values by Metro Area
group cp.Population by mc.MetroAreaID into g
select new
{
MetroID = g.Key, // Key = mc.MetroAreaID
Population = g.Sum() // g = seq. of Population values
} into mg
// Metro for MetroID
join m in GeoMetroArea.All() on mg.MetroID equals m.ID
select new { m.Name, mg.Population };