0

我正在尝试编写一个 linq 查询,它使用多个相关数据表并且卡住了。

预期结果:我需要按人口递减返回每个地区人口最多的三个大都市区。

带有样本数据的表格:

MetroAreas -- ID, Name
2, Greater New York

城市 -- ID、姓名、StateID
1293912、纽约市、10

CityPopulations -- 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 以获取城市 ID。加入城市以获取州 ID。加入州以获取地区 ID。加入区域,以便我可以使用 where 进行过滤。当我尝试包含 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;  

任何人都可以帮助我解决这个问题或指出正确的方向吗?非常非常感谢你。

4

1 回答 1

1

我还没有编译它,但这应该让你接近:

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 };
于 2009-10-12T16:59:22.403 回答