Como usar a função com valor escalar com linq para entidade? [duplicado]

Duplicata Possível:
As funções de nível SQL podem ser disponibilizadas para as consultas LINQ to Entity?

Eu tenho uma função escalar que obtém a distância entre dois pontos e eu quero usá-lo para consultar o registro mais próximo ao ponto. A função escalar trabalha com linq para sql mas falha com EF

a função escalar

USE [GeoData]
GO

/****** Object:  UserDefinedFunction [dbo].[DistanceBetween]    Script Date: 09/18/2012 19:40:44 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



CREATE FUNCTION [dbo].[DistanceBetween](@Lat1 as real,
@Long1 as real, @Lat2 as real, @Long2 as real)
RETURNS real
AS
BEGIN

DECLARE @dLat1InRad as float(53);
SET @dLat1InRad = @Lat1;
DECLARE @dLong1InRad as float(53);
SET @dLong1InRad = @Long1;
DECLARE @dLat2InRad as float(53);
SET @dLat2InRad = @Lat2;
DECLARE @dLong2InRad as float(53);
SET @dLong2InRad = @Long2 ;

DECLARE @dLongitude as float(53);
SET @dLongitude = @dLong2InRad - @dLong1InRad;
DECLARE @dLatitude as float(53);
SET @dLatitude = @dLat2InRad - @dLat1InRad;
/* Intermediate result a. */
DECLARE @a as float(53);
SET @a = SQUARE (SIN (@dLatitude / 2.0)) + COS (@dLat1InRad)
* COS (@dLat2InRad)
* SQUARE(SIN (@dLongitude / 2.0));
/* Intermediate result c (great circle distance in Radians). */
DECLARE @c as real;
SET @c = 2.0 * ATN2 (SQRT (@a), SQRT (1.0 - @a));
DECLARE @kEarthRadius as real;
/* SET kEarthRadius = 3956.0 miles */
SET @kEarthRadius = 6376.5;        /* kms */

DECLARE @dDistance as real;
SET @dDistance = @kEarthRadius * @c;
return (@dDistance);
END

GO

Eu adicionei um modelo de entidade ado.net, atualizei o modelo do banco de dados e escolhi a distância entre

 <Function Name="DistanceBetween" ReturnType="real" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
      <Parameter Name="Lat1" Type="real" Mode="In" />
      <Parameter Name="Long1" Type="real" Mode="In" />
      <Parameter Name="Lat2" Type="real" Mode="In" />
      <Parameter Name="Long2" Type="real" Mode="In" />
    </Function>

Eu fiz uma aula parcial e escrevi este método

public partial class GeoDataEntities
{
    [EdmFunction("GeoDataModel.Store", "DistanceBetween")]
    public double DistanceBetween(double lat1, double lon1, double lat2, double lon2)
    {
        throw new NotImplementedException();
    }
}

Eu tentei muitas vezes para consultar a função com este código, mas ele recebe um erro

var NParcel = db.geoAddresses.Where(g=> db.DistanceBetween(21.5,39.5, g.lat,g.lon) < 20);

quando eu tentocount ouforeach o NParcel eu recebo esse erro

O método especificado 'Double DistanceBetween (Double, Double, Double, Double)' no tipo 'EFSample.GeoDataEntities' não pode ser convertido em uma expressão de loja LINQ to Entities.

e stacktrace

em System.Data.Objects.ELinq.ExpressionConverter.ThrowUnresolvableFunction (Expression Expression) em System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.FunctionCallTranslator.TranslateFunctionCall (pai ExpressionConverter, chamada MethodCallExpression, EdmFunctionAttribute functionAttribute) em System.Data.Objects.ELinq .ExpressionConverter.MethodCallTranslator.TypedTranslate (ExpressionConverter pai, MethodCallExpression linq) em System.Data.Objects.ELinq.ExpressionConverter.BinaryTranslator.TypedTranslate (pai ExpressionConverter, BinaryExpression linq) em System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression (Expression linq) em System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda (LambdaExpression lambda, entrada DbExpression) em System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate (pai ExpressionConverter, chamada MethodCallExpression, DbExpression & source, DbExpressionBinding & sourceBinding, DbExpressio n & lambda) em System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate (pai ExpressionConverter, chamada MethodCallExpression) em System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate (pai ExpressionConverter, MethodCallExpression linq) em System. Data.Objects.ELinq.ExpressionConverter.TranslateExpression (Expression linq) em System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.AggregateTranslator.Translate (pai ExpressionConverter, chamada MethodCallExpression) em System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate (ExpressionConverter pai, MethodCallExpression linq) em System.Data.Objects.ELinq.ExpressionConverter.Convert () em System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan (Nullable1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults (Nullable1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator () no System.Linq.Enumerable.Single [TSource] (IEnumerable1 source) at System.Linq.Queryable.Count[TSource](IQueryable1 fonte)

questionAnswers(1)

yourAnswerToTheQuestion