Pregunta

Estoy intentando escribir una consulta LINQ que utiliza varias tablas de datos relacionados y han quedado atascada.

El resultado esperado:. Tengo que devolver las tres áreas metropolitanas más pobladas por región descendente población

mesas w / datos de ejemplo:

MetroAreas - ID, Nombre
2, Gran Nueva York

Cities - ID, Nombre, IdentificadorEstado
1293912, la ciudad de Nueva York, 10

CityPopulations - ID, CityId, CensusYear, Población
20, 1293912, 2008, 123456789
21, 1293912, 2007, 123 454 321

MetroAreaCities - ID, CityId, MetroAreaID
1, 1,293,912, 2

Unidos - ID, Nombre, regionId
10, Nueva York, 5

Regiones - ID, Nombre
5, Northeast

Comienzo con las áreas metropolitanas. Unirse a los MetroAreaCities para obtener los ID de ciudad. Unirse a las ciudades para obtener identificaciones estatales. Unirse a los Estados para obtener el ID de región. Unirse a las regiones para que pueda filtrar con un dónde. Se queda bloqueado cuando intento para incluir CityPopulations. Sólo quiero las tres áreas metropolitanas más pobladas de una región determinada. Haciendo una simple combinación en los cityPopulations devuelve un registro por año.

(Esto es lo que tengo hasta ahora, esta consulta fue escrito para 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;  

¿Puede alguien ayudarme con esta consulta o que me señale en la dirección correcta? Gracias muy mucho.

¿Fue útil?

Solución

No he compilado, pero esto debería conseguir que cierre:

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 };
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top