2009-10-12 98 views
0

我正在尝试写一个linq查询,它使用多个相关数据表并且陷入了困境。Linq查询帮助

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

表W /样本数据:

MetroAreas - ID,名称
2,大纽约

城市 - ID,姓名,STATEID
1293912,纽约市,10

城市人口 - 城市ID,城市ID,人口普查年,人口
20,1293912,2008年,123456789
21,1293912,2007年,123454321

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

国 - ID,姓名, RegionID
10,纽约,5个

地区 - ID,名称
5,没有rtheast

我开始与地铁领域。加入MetroAreaCities以获取城市ID。加入城市以获取州ID。加入国家以获得区域ID。加入地区,我可以过滤一个地方。当我试图包含CityPopulations时,我陷入了困境。我只想要一个特定地区的三个人口最多的都市区。在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; 

谁能帮我这个查询或点我在正确的方向?非常非常感谢你。

+1

你要哪一年使用人口?最近的?平均? – 2009-10-12 16:14:03

+0

我想最近一年... – jas 2009-10-12 18:20:42

回答

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 }; 
+0

辉煌!工作很小的变化......荣誉! 我正在玩linq的严重追赶,不要假装完全理解你所做的一切。任何机会,你可以告诉我如何改变cp.CensusYear == year年份的行,以拉取CityPopulation表中存在的最大/最大年份? – jas 2009-10-13 05:42:25

+0

我已经添加了一个查询来获取最大的人口普查年。正如所写,该查询将分开执行;如果SubSonic LINQ提供程序足够智能,则可以完全删除“年”变量,并将该查询内联,以避免再次访问数据库。 – dahlbyk 2009-10-13 12:40:26