0

関連データの複数のテーブルを使用する linq クエリを作成しようとしていますが、スタックしてしまいました。

期待される結果: 地域ごとに最も人口の多い 3 つの大都市圏を、人口の降順で返す必要があります。

サンプルデータ付きのテーブル:

MetroAreas -- ID、名前
2、グレーター ニューヨーク

都市 -- ID、名前、StateID
1293912、ニューヨーク市、10

CityPopulations -- ID、CityID、CensusYear、人口
20、1293912、2008、123456789
21、1293912、2007、123454321

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

州 -- ID、名前、地域 ID
10、ニューヨーク、5

地域 -- ID、名前
5、北東

私は大都市圏から始めます。MetroAreaCities に参加して都市 ID を取得します。都市に参加して州 ID を取得します。States に参加して地域 ID を取得します。地域を結合して、場所でフィルタリングできるようにします。CityPopulations を含めようとすると行き詰まります。特定の地域で最も人口の多い 3 つの大都市圏のみが必要です。cityPopulations で単純な結合を行うと、1 年あたりのレコードが返されます。

(これが私がこれまでに持っているものです。このクエリは 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 に答える