簡體   English   中英

Linq查詢以選擇不同的記錄並計算不同的記錄數

[英]Linq query to select distinct record and count number of distinct record

我有tblVisitor表,該表存儲訪問者的位置詳細信息。 它具有以下結構。

vRegion      NVARCHAR (100) NULL,
vTimeZone    NVARCHAR (100) NULL,
vLat         NVARCHAR (MAX) NULL, //Latitude
vLong        NVARCHAR (MAX) NULL, //Longitude

現在,此存儲取決於每個session並且當session到期時,可能會再次存儲相同的位置詳細信息。 現在,我試圖在地圖中顯示它,從而在模型類中獲取緯度和經度詳細信息。 我的模型課如下:

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個問題。.將nvarchar類型的LatitudeLongitude值轉換為double nvarchar ,然后獲取不同的緯度和經度值並計算發生的次數。.當我互換轉換為ToList()Distinct() ToList()之前,反之亦然。.我感覺差不多了,但是不確定丟失了什么。 任何人都可以幫忙。

您應該執行一個查詢,將其按緯度和經度分組並獲取計數。 然后將結果轉換為模型。 想要從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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM