我有表tblVisitor
,用于存储访问者的位置详细信息。它具有以下结构。
vRegion NVARCHAR (100) NULL,
vTimeZone NVARCHAR (100) NULL,
vLat NVARCHAR (MAX) NULL, //Latitude
vLong NVARCHAR (MAX) NULL, //Longitude
现在,此存储取决于每个session
,当session
到期时,可能会再次存储相同的位置详细信息。现在我试图在Map中显示它,从而获得模型类中的Latitude和Longitude细节。我的模型类如下:
public class VisitorMapViewModel
{
public int count { get; set;}
public GeoCoordinate coords { get; set; }
}
我试图填写下面的模型,但没有运气。
List<VisitorMapViewModel> model = new List<VisitorMapViewModel>();
var data = _db.tblVisitors.Distinct().ToList().Select(v => new VisitorMapViewModel()
{
coords = new System.Device.Location.GeoCoordinate(Convert.ToDouble(v.vLat), Convert.ToDouble(v.vLong)),
count = _db.tblVisitors.GroupBy(m => new { m.vLat,m.vLong}).Select(m=>m).Distinct().Count()
}).ToList();
这里有2个问题。将Latitude
类型Longitude
和nvarchar
转换为double
,然后获取纬度和经度的不同值并计算数量当我在ToList()
之前交换转换为Distinct()
时,上面的查询仍然会遇到一种或另一种异常。反之亦然。我觉得差点接近,但不确定遗漏了什么。请有人帮忙。
答案 0 :(得分:4)
您应该执行一个在纬度和经度上分组并获取计数的查询。然后将结果转换为您的模型。当您想要从SQL查询切换到内存Linq查询时,可以使用AsEnumerable
,而无需创建列表的开销。
var data = (from visitor in _db.tblVisitors
group visitor by new { visitor.vLat, visitor.vLong } into grp
select new
{
grp.Key.vLat,
grp.Key.vLong,
Count = grp.Count()
})
.AsEnumerable()
.Select(x => new new VisitorMapViewModel()
{
coords = new System.Device.Location.GeoCoordinate(
double.Parse(x.vLat),
double.Parse(x.vLong)),
count = x.Count
})
.ToList();
或者你可以用方法语法
完成所有这些var data = _db.tblVisitors
.GroupBy(v => new { v.vLat, v.vLong })
.Select(grp => new
{
grp.Key.vLat,
grp.Key.vLong,
Count = grp.Count()
})
.AsEnumerable()
.Select(x => new new VisitorMapViewModel()
{
coords = new System.Device.Location.GeoCoordinate(
double.Parse(x.vLat),
double.Parse(x.vLong)),
count = x.Count
})
.ToList();