2009-10-12 158 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