Справка по Linq-запросу - PullRequest
       21

Справка по Linq-запросу

0 голосов
/ 12 октября 2009

Я пытаюсь написать запрос linq, который использует несколько таблиц связанных данных и застрял.

Ожидаемый результат: мне нужно вернуть три самых густонаселенных столичных района на регион по убыванию населения.

таблицы с образцами данных:

MetroAreas - ID, Имя
2, Большой Нью-Йорк

Города - идентификатор, имя, идентификатор штата
1293912, Нью-Йорк, 10

CityPopulation - ID, CityID, CensusYear, население
20, 1293912, 2008, 123456789
21, 1293912, 2007, 123454321

MetroAreaCities - ID, CityID, MetroAreaID
1, 1293912, 2

Состояния - ID, Имя, RegionID
10, Нью-Йорк, 5

Регионы - ID, Имя
5, северо-восток

Я начинаю с зон метро. Присоединяйтесь к MetroAreaCities для получения идентификаторов городов. Присоединяйтесь к городам, чтобы получить государственные идентификаторы. Присоединяйтесь к государствам, чтобы получить идентификатор региона. Присоединяйтесь к регионам, чтобы я мог фильтровать с помощью где. Я застреваю, когда пытаюсь включить CityPopulations. Я хочу только три самых густонаселенных района метро для данного региона. Простое объединение с cityPopulations возвращает рекорд за год.

(вот что у меня есть, этот запрос был написан для SubSonic 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;  

Может кто-нибудь помочь мне с этим запросом или указать мне правильное направление? Большое спасибо.

1 Ответ

1 голос
/ 12 октября 2009

Я не скомпилировал его, но это должно вас приблизить:

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 };
...