Find nearest object query with LINQ
While LINQ simplifies your DAL in myriad ways, this seemingly simple query made me stop and think about how to properly explain this to the query engine
Problem: Given an input of a current location (latitude and longitude) find all objects in the database within a specified radius
Disclaimer: This is using a bounding box hack rather than an accurate radius forumula, use at your own risk as there is some loss of precision.
/// Find all courts within a specified radius (in miles) to a point (latitude & longitude)
/// <param name="latitude">degrees(decimal)</param>
/// <param name="longitude">degrees(decimal)</param>
/// <param name="radius">miles</param>
/// <returns></returns>
public IQueryable<Court> FindNearbyCourts(decimal latitude, decimal longitude, decimal radius);
The first order of business is to convert miles to degrees of latitude and longitude, respectively.
| Latitude: | Factor out Equatorial bulge, and a degree of latitude is simply 69.04 statute miles. |
| Longitude: | On the other hand, longitude varies in length depending on your current latitude. For this example, I am assuming 30°N. Thus, one degree of longitude is 59.96 statute miles. |
decimal radiusLatitude = radius / 69.04;
decimal radiusLongitude = radius / 59.96;
Once we have these conversions in place, we are ready to build our LINQ query:
IQueryable<Court> nearbyCourts = from court in _db.Courts where (Math.Abs(court.latitude - latitude) < radiusLatitude) where (Math.Abs(court.longitude - longitude) < radiusLongitude) select court;
Return the IQueryable object nearbyCourts you just generated and you're all set.
How do grilled BBQ Ribs, a Cauldron of Brunswick stew, chicken, hotdogs & hamburgers sound for a Saturday in Spring? I thought it sounded great, so I'd like you to join me this Saturday for the festivities. Slated to be an extravaganza of southern food, your tastebuds will not soon forgive you for missing out.
Saturday, May 9th at 7pm
Some suggestions for items you might want to bring:
- Chips / Dip
- Sodas
- Beer
- Any Adult Beverages you might like (some will be provided)
- Smores ingredients: Marshmallows, Chocolate Bars, Graham Crackers
- A Blender (i have the stuff to make Margaritas, but a broken blender)
- Anything else you might feel inclined to bring and share
- Or, just bring yourself and a guest if you like
Looking forward to seeing you!
~Chris & Bridget
When Travis mentioned to the group that his Barbershop Quartet would be competing in a Barbershop Quartet competition right around the corner in Winston-Salem, NC, a few of us decided to attend to cheer him on. One day we were discussing it in the Common Area and some crazy ideas were thrown out, namely a few of us dressing up as a Train, befitting their group name, Grand Central. It turned into quite a crazy evening, as the video evidence to the right shows. Thanks to Bridget, Rex, Lucas, Brandon, Jason for your participation in the aforementioned silliness. I would also like to thank Tony and David for responding to our tweets and suppling the cardboard and UPS respectively. You may view the rest of the photos here on Flickr.
Testing the smokestack system for the official Grand Central
train.
Google provides a Charting API with a
host of useful charts. I spent a few minutes playing around with the map chart section to create a
color-coded map of the states I have visited in the USA.

The Venn Diagram was an interesting option that I had not expected, but good
stuff.

If you are building a dashboard, the Google-o-meter might come in
handy
I find myself spending quite a bit of my spare time on Stackoverflow in recent weeks, and decided I wanted to
display my current rep on my blog. A few days ago I built a dynamically generated
(and cached for 2 hours for traffic's sake) user ranking report, since my request for
this on Uservoice was not
approved.
HtmlAgilityPack has been my
weapon of choice in recent days. It was a good fit for this project and the end
result looks like this:

And in case you might ask "Show me the code!" here you are.
Feel free to use it for your own project if you like.
<%@ WebHandler Language="C#" Class="Badge" %>
using System;
using System.Web;
public class Badge : IHttpHandler {
public void ProcessRequest (HttpContext context)
{
string includeLogo = !string.IsNullOrEmpty(context.Request.QueryString["useLogo"]) ? context.Request.QueryString["useLogo"] : string.Empty;
string userId = !string.IsNullOrEmpty(context.Request.QueryString["userid"]) ? context.Request.QueryString["userid"] : "1551";
string jsMode = !string.IsNullOrEmpty(context.Request.QueryString["jsMode"]) ? context.Request.QueryString["jsMode"] : string.Empty;
PageRetriever pr = new PageRetriever("http://stackoverflow.com/users/" + userId + "/");
pr.GetPage();
User userBadges = pr.ExtractBadge();
if (!string.IsNullOrEmpty(jsMode))
{
context.Response.ContentType = "text/javascript";
context.Response.Write("document.getElementById('stackoverflowRep').innerHTML = '");
}
else
{
context.Response.ContentType = "text/html";
}
if (!string.IsNullOrEmpty(includeLogo))
{
context.Response.Write("<div style=\"height:40px\"><div style=\"float:left\"></div><div style=\"float:left;\">"); context.Response.Write(<img src=\"http://www.chrisballance.com/so/resources/stackoverflow-logo-250.png\" />");
}
context.Response.Write(userBadges.Rep);
if (!string.IsNullOrEmpty(includeLogo))
{
context.Response.Write("<br /><a href=\"http://stackoverflow.com/users/");
context.Response.Write(userId);
context.Response.Write("\">");
context.Response.Write(userBadges.Username);
context.Response.Write("</a></div></div></div>");
}
if (!string.IsNullOrEmpty(jsMode))
{
context.Response.Write("';\n");
}
}
public bool IsReusable {
get {
return false;
}
}
}
Since I could not find a chart of some sort showing current rankings on
StackOverflow.com, I decided to roll my own. The link that follows points to a
static cached version of the page that will only update manually for now. Enjoy,
and feel free to give your feedback or suggestions for improvements.
Current StackOverflow.com
Rankings
F# has 'easy button' for finding large primes! 29
lines of code! Thanks to Chris
Smith and his 'completely unique view' on the Sieve of Eratosthenes
#light
open System.Collections.Generic
open System
let findPrimes =
seq {
yield 2 //2 is a known prime
let knownComposites = new HashSet<int>()
//Visit each odd
for i in 3 .. 2 .. int 1E6 do
// Check known composites, if not present, it is prime.
let found = knownComposites.Contains(i)
if not found then
yield i
// Add all multiples of i to our sieve, starting
// at i and irecementing by i.
do for j in i .. i .. int 1E6 do
knownComposites.Add(j) |> ignore
}
printfn "Here are the first 10001 primes:"
Seq.iter (fun p -> printf "\t%d" p) (Seq.take 10001 findPrimes)
Console.ReadKey(true)
Euler #6 is very straightforward. I was concerned about needing to work with numbers > 2^32, but this was not a factor. I initially set my bound to < max instead of <= max which threw my results off my a small margin (1-99 instead of 1-100). Runtime is < 1 ms, only ~2400 ticks.
using System;
using System.Diagnostics;
namespace Euler6
{
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
long result = SumDifference(1, 100);
sw.Stop();
Console.WriteLine("Runtime was " + sw.ElapsedMilliseconds + " ms");
Console.WriteLine("Runtime was " + sw.ElapsedTicks +" ticks");
Console.WriteLine("Sum difference is: " + result);
Console.ReadLine();
}
static long SumDifference(int begin, int end)
{
return SquareOfSums(begin, end) - SumOfSquares(begin, end);
}
static long SumOfSquares(int begin, int end)
{
long returnValue = 0;
for (int i = begin; i <= end; i++)
{
returnValue += Convert.ToInt64(Math.Pow(i,2));
}
return returnValue;
}
static long SquareOfSums(int begin, int end)
{
long returnValue = 0;
for (int i = begin; i <= end; i++)
{
returnValue += i;
}
return Convert.ToInt64(Math.Pow(returnValue, 2));
}
}
}
This one was elusively easy since I went with a simple brute-force approach. Execution averages 1 second.
using System;
using System.Diagnostics;
namespace Euler5
{
class Program
{
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
int lcm = FindLeastCommonMultiple();
sw.Stop();
Console.WriteLine("Runtime was " + sw.ElapsedMilliseconds + " ms");
Console.WriteLine("Runtime was " + sw.ElapsedTicks + " ticks");
Console.WriteLine("LCM is " + lcm);
Console.ReadLine();
}
private static int FindLeastCommonMultiple()
{
for (int i = 2520; i < int.MaxValue; i += 20)
{
if (IsDivisibleByRange(i, 1, 20))
return i;
}
return -1;
}
static long SmallestNumber()
{
return factorial(20);
}
static long factorial(long n)
{
long returnValue = 1;
for (int i = 1; i < n; i++)
{
returnValue *= i;
}
return returnValue;
}
static bool IsDivisibleByRange(int num, int begin, int end)
{
for (int i = begin; i <= end; i++)
{
if ((num % i) != 0)
{
return false;
}
}
return true;
}
}
}
|