Linq查询帮助

时间:2009-10-12 16:04:48

标签: linq linq-to-sql subsonic linq-query-syntax

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

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

表格/样本数据:

MetroAreas - ID,姓名
2,大纽约

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

CityPopulations - ID,CityID,CensusYear,Population
20,1293912,2008,123456789
21,12293912,2007,123454321

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

状态 - ID,名称,RegionID
10,纽约,5

区域 - ID,名称
5,东北

我从都市区开始。加入MetroAreaCities获取城市ID。加入城市以获取州ID。加入各州以获取地区ID。加入区域,以便我可以过滤到哪里。当我试图加入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 个答案:

答案 0 :(得分: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 };