我正在开发一个地图应用程序,需要能够将一个巨大的位置值数据集削减成更合理的值。所以我想做的是通过舍入值对位置进行分组,如下面的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;
答案 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() }