寻找更好的方法来获得每个城市的计数

时间:2012-05-29 23:29:56

标签: c# linq entity-framework

我试图了解某个城市居住的人数。我有一个包含人员的数据库,该表有一个外键将某个人与一个城市联系起来,这是另一个表。

示例:

城市z:5人

城市y:10人

城市x:4人

我能够得到这些结果,但我只是不喜欢我这样做的方式,因为我正在调用数据库x次。

 public List<int> getStuff(List<int> listOfCityIDs )
    {
       var returnList = new List<int>();
       foreach (int z in listOfCityIDs)
        {
             returnList.Add((from x in conn.people
                             where x.city == z
                             select x).Count());
        }
        return returnList;
    }

我非常确定使用一些LINQ有更好/更有效的方法,但我似乎无法找到它。

任何想法?

亲切的问候, 简

4 个答案:

答案 0 :(得分:3)

这将很好地转换为SQL语句。

conn.people.GroupBy(p => p.city).Select(p => new { City = p.Key, Count = p.Count()});

这将使他们全部。如果您想要某些城市,请尝试

conn.people.Where(p => listOfCityIDs.Any(c => c == p.city))
  .GroupBy(p => p.city).Select(p => new { City = p.Key, Count = p.Count()});

答案 1 :(得分:2)

如果您需要更清晰的语法并且它可以作为延迟查询

var g = from c in cities
    join p in people
    on c equals p.CityId
    group p.CityId by p.CityId into grouped
    select new { CityId = grouped.Key, Count = grouped.Count() };

答案 2 :(得分:0)

当你打电话时,Linq会为你优化这个.Count()它意识到你不需要整个结果集。

还要记住,如果您正在访问数据库(我假设您是这样),那么结果集是一个IQueryable,在您尝试从中获取值之前,它不会被执行。

答案 3 :(得分:0)

如何按城市ID分组人员?