实体框架/ LINQ回合和纬度/经度计数

时间:2013-12-08 19:15:40

标签: c# .net sql-server linq entity-framework

我正在开发一个地图应用程序,需要能够将一个巨大的位置值数据集削减成更合理的值。所以我想做的是通过舍入值对位置进行分组,如下面的SQL:

select ROUND(Latitude, 0), ROUND(Longitude, 0), count(*) from tweet
group by ROUND(Latitude, 0), ROUND(Longitude, 0)
order by count(*) desc

尽管使用EF和/或LINQ,我仍然无法以我需要的方式进行分组工作(主要是因为我似乎无法理解它是如何工作的)。理想情况下,我更喜欢在EF查询中将其设置为正确,以便它成为SQL语句的一部分,并且我不必在对它执行某些LINQ操作之前将巨型数据集带入List ...但是如果必须的话那样做就这样吧。

我可以这样做,但我不想:

var items = context.ExecuteStoreQuery<DataPoint>("select ROUND(Latitude, 0) as lat, ROUND(Longitude, 0)as lon, count(*) as weight from location " +
"group by ROUND(Latitude, 0), ROUND(Longitude, 0) " +
"order by count(*) desc", null).ToList();

编辑: 下面接受的最终解决方案(有点来回)最终看起来像这样:

private class DataPoint
{
  public double lat { get; set; }
  public double lon { get; set; }
  public int weight { get; set; }
}

var mydata = (from t in locations
group t by new { 
Latitude = EntityFunctions.Truncate(t.Latitude, accuracy).Value, 
Longitude = EntityFunctions.Truncate(t.Longitude, accuracy).Value } 
into g
orderby g.Count()
select new DataPoint{ lat =  g.Key.Latitude, lon = g.Key.Longitude, weight = g.Count() }).ToList();

不要忘记使用声明添加此内容:

using System.Data.Objects;

1 个答案:

答案 0 :(得分:0)

from t in context.Tweets
group t by new { t.Latitude, t.Longitude } into g
order by g.Count() desc
select new { g.Key.Latitude, g.Key.Longitude, Count = g.Count() }