I would also like to add a comment but to @BenoitGlaizette. 
The code polygon.Area.HasValue can throw the following error for some Multipolygons.
ArgumentException: 24144: This operation cannot be completed because
  the instance is not valid. Use MakeValid to convert the instance to a
  valid instance. Note that MakeValid may cause the points of a geometry
  instance to shift slightly.
However this won't occur if we convert to SqlGeography directly.
public bool IsInside(DbGeography polygon, double longitude, double latitude)
{
    DbGeography point = DbGeography.FromText(string.Format("POINT({1} {0})", latitude.ToString().Replace(',', '.'), longitude.ToString().Replace(',', '.')), DbGeography.DefaultCoordinateSystemId);
    var wellKnownText = polygon.AsText();
    var sqlGeography =
        SqlGeography.STGeomFromText(new SqlChars(wellKnownText), DbGeography.DefaultCoordinateSystemId)
            .MakeValid();
    //Now get the inversion of the above area
    var invertedSqlGeography = sqlGeography.ReorientObject();
    //Whichever of these is smaller is the enclosed polygon, so we use that one.
    if (sqlGeography.STArea() > invertedSqlGeography.STArea())
    {
        sqlGeography = invertedSqlGeography;
    }
    polygon = DbSpatialServices.Default.GeographyFromProviderValue(sqlGeography);
    return point.Intersects(polygon);
}
For those that use Entity Framework 5<:
I use this extension method to check every Polygon and Multipolygon before saving them to the database.
public static DbGeography MakePolygonValid(this DbGeography geom)
{
    var wellKnownText = geom.AsText();
    //First, get the area defined by the well-known text using left-hand rule
    var sqlGeography =
        SqlGeography.STGeomFromText(new SqlChars(wellKnownText), DbGeography.DefaultCoordinateSystemId)
            .MakeValid();
    //Now get the inversion of the above area
    var invertedSqlGeography = sqlGeography.ReorientObject();
    //Whichever of these is smaller is the enclosed polygon, so we use that one.
    if (sqlGeography.STArea() > invertedSqlGeography.STArea())
    {
        sqlGeography = invertedSqlGeography;
    }
    return DbSpatialServices.Default.GeographyFromProviderValue(sqlGeography);
}
I can then use a method like this to check Intersects at database level.
public static class GeoHelper
{
    public const int SridGoogleMaps = 4326;
    public const int SridCustomMap = 3857;
    public static DbGeography PointFromLatLng(double lat, double lng)
    {
        return DbGeography.PointFromText(
            "POINT("
            + lng.ToString(CultureInfo.InvariantCulture) + " "
            + lat.ToString(CultureInfo.InvariantCulture) + ")",
            SridGoogleMaps);
    }
}
public County GetCurrentCounty(double latitude, double longitude)
{
    var point = GeoHelper.PointFromLatLng(latitude, longitude);
    var county = db.Counties.FirstOrDefault(x =>
        x.Area.Intersects(point));
    return county;
}
T-SQL generated by Entity Framework:
SELECT TOP (1) 
[Extent1].[Id] AS [Id], 
[Extent1].[Name] AS [Name], 
[Extent1].[Code] AS [Code], 
[Extent1].[Area] AS [Area]
FROM [Election].[County] AS [Extent1]
WHERE ([Extent1].[Area].STIntersects(@p__linq__0)) = 1
-- p__linq__0: 'POINT (10.0000000 32.0000000)' (Type = Object)
Can be tested like this manually:
declare @p__linq__0 varchar(max)
set @p__linq__0 = 'POINT (10.0000000 32.0000000)' 
SELECT TOP (1) 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[Code] AS [Code], 
    [Extent1].[Area] AS [Area]
    FROM [Election].[County] AS [Extent1]
    WHERE ([Extent1].[Area].STIntersects(@p__linq__0)) = 1
More information can be found here:
https://learn.microsoft.com/en-us/sql/t-sql/spatial-geometry/stintersects-geometry-data-type