Linq查询选择不同记录和不同记录的计数

时间:2016-04-19 18:43:29

标签: c# entity-framework linq asp.net-mvc-4

我有表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类型Longitudenvarchar转换为double,然后获取纬度和经度的不同值并计算数量当我在ToList()之前交换转换为Distinct()时,上面的查询仍然会遇到一种或另一种异常。反之亦然。我觉得差点接近,但不确定遗漏了什么。请有人帮忙。

1 个答案:

答案 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();