public async Task FullDump() { var lastAccess = await Mongo.GetLastDailyStats(); Response.Headers[HeaderNames.LastModified] = lastAccess.Date.ToUniversalTime().ToString("R"); Response.Headers[HeaderNames.ContentType] = "text/csv"; Response.StatusCode = (int)HttpStatusCode.OK; await Response.WriteAsync("Date,TotalMinutesTracked,CentroidGeohash,CentroidLat,CentroidLong,GeohashBoxJSON,LocationCount,VehicleCount,EventCount,SampleCount,DiscardedSampleCount,BoundingBoxDiagonal,MinAtHome,MinAtWork,MinAtSchool,MinAtLocations,MinElsewhere" + Environment.NewLine); var cursor = await Mongo.FetchAllDailyStats(); while (await cursor.MoveNextAsync()) { foreach (var stat in cursor.Current) { var centroid = stat.CentroidHash ?? Geohasher.Encode(stat.Centroid.Coordinates.Latitude, stat.Centroid.Coordinates.Longitude, 5); var bbox = Geohasher.GetBoundingBox(centroid); var polygon = new Polygon(new LineString[] { new LineString(new IPosition[] { new Position(bbox[0], bbox[2]), new Position(bbox[0], bbox[3]), new Position(bbox[1], bbox[3]), new Position(bbox[1], bbox[2]), new Position(bbox[0], bbox[2]) }) }); await Response.WriteAsync(string.Join(",", stat.Date.ToString("yyyy-MM-dd"), stat.TotalMinutesTracked, centroid, stat.Centroid.Coordinates.Latitude.ToString("F5"), stat.Centroid.Coordinates.Longitude.ToString("F5"), "\"" + JsonConvert.SerializeObject(polygon).Replace("\"", "\"\"") + "\"", stat.LocationCount, stat.VehicleCount, stat.EventCount, stat.SampleCount, stat.DiscardedSampleCount, stat.BoundingBoxDiagonal.ToString("F2"), stat.LocationTracking.MinutesAtHome, stat.LocationTracking.MinutesAtWork, stat.LocationTracking.MinutesAtSchool, stat.LocationTracking.MinutesAtOtherKnownLocations, stat.LocationTracking.MinutesElsewhere ) + Environment.NewLine); } } }