2016-04-19 10 views
0

私はテーブルtblVisitorに訪問者の場所の詳細を格納しています。それは以下の構造を持っています。異なるレコードを選択するためのLinqクエリと異なるレコードのカウント数

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つの問題は、上記のクエリは、1つまたは他の種類を打つ保持.. doubleにタイプnvarcharLatitudeLongitude値を変換した後、緯度と経度の個別の値を取得し、occurancesの数を数える..あり私がToList()に変換してDistinct()の前に交換すると例外が発生します。逆の場合もあります。誰でもこの助けてください。

答えて

4

緯度と経度をグループ化してカウントを取得するクエリを1つ実行する必要があります。その後、結果をモデルに変換します。リストを作成するオーバーヘッドを必要とせずに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(); 
+0

にすべてのメソッドの構文でとてもこれを行うことができます。..一つの最後の質問は、パフォーマンスとメモリが来る時には、上記の方法で、どちらがあなたが使用することをお勧めします..作品の魅力のように画像に? –

+1

@ GuruprasadRaoパフォーマンスやメモリに関する限り、文字通り同じです。それはもっとスタイルの問題です。最初の部分は、最初の部分がSQL IMOに変換されるLinqですが、2番目の部分は「よりクリーン」に見えることがより明白になります。 – juharr

+0

ニース..おかげさまでもう一度...ハッピーコーディング..私は人々がなぜ私たちが試みたものを示し、良い質問を投稿しようとしているのを鼓舞するのか分からない。 –

関連する問題