Как использовать скалярную функцию с linq to entity? [Дубликат]

Возможный дубликат:

Можно ли сделать функции уровня SQL доступными для запросов LINQ to Entity?

У меня есть скалярная функция, которая получает расстояние между двумя точками, и я хочу использовать ее для запроса ближайшей записи к точке. Скалярная функция работает с linq to sql, но не работает с EF

скалярная функция

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

Я добавил модель сущности ado.net, обновил модель из базы данных и выбрал расстояние между

 
      
      
      
      
    

Я сделал частичный класс и написал этот метод

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

Я пытался много раз запросить функцию с этим кодом, но он получает ошибку

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

когда я пытаюсьcount или жеforeach NParcel я получаю эту ошибку

Указанный метод 'Double DistanceBetween (Двухместный, Двухместный, Двухместный, Двухместный) ' по типуEFSample.GeoDataEntities' не может быть переведено в выражение хранилища LINQ to Entities.

и трассировка стека

в System.Data.Objects.ELinq.ExpressionConverter.ThrowUnresolvableFunction (Выражение выражения) в System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.FunctionCallTranslator.TranslateFunctionCall (выражение ExpressionConverter, метод FunctionTjectAbject.Amp). .ExpressionConverter.MethodCallTranslator.TypedTranslate (родитель ExpressionConverter, MethodCallExpression linq) в System.Data.Objects.ELinq.ExpressionConverter.BinaryTranslator.TypedTranslate (родитель ExpressionConverter, BinaryExpression linq) (выражение для логической операции Expression). в System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda (лямбда-выражение лямбда, вход DbExpression) в System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate, выражение-выражение & родительский метод ExpressionConverter, выражение-выражение источник, DbExpressionBinding & sourceBinding, DbExpression & лямбда) в System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate (родитель ExpressionConverter, вызов MethodCallExpression) в System.Data.Objects.ELinq.ExpressionConverter. .Objects.ELinq.ExpressionConverter.TranslateExpression (Выражение linq) в System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.AggregateTranslator.Translate (выражение ExpressionConverter, вызов методаCallExpression) в System.Data.Transl.TechTell.Exject.Exjects Родитель ExpressionConverter, метод MethodCallExpression linq) в System.Data.Objects.ELinq.ExpressionConverter.Convert () в System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan (Nullable)1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults (Nullable1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator () в System.Linq.Enumerable.Single [TSource] (IEnumerable1 source) at System.Linq.Queryable.Count[TSource](IQueryable1 источник)

Ответы на вопрос(1)

Ваш ответ на вопрос