Entity Framework 6 Первые пользовательские функции кода

Я пытаюсь что-то похожее на это:

Как использовать скалярнозначную функцию с linq для объекта?

Однако я не использую EDMX, а вместо этого просто DbContext и код в первую очередь.

Я столкнулся с этим:

https://codefirstfunctions.codeplex.com/

Но использование не подходит. Я пытаюсь добиться этого:

var locations = context.Locations.Where(e => Functions.LatLongDistanceCalc(e.Lat, e.Long, lat, long) >= 10)

Здесь он вызовет скалярную функцию (LatLongDistanceCalc) на SQL Server.

Есть ли способ сделать это без использования EDMX? Я знаю, что вы можете создать ручной запрос, но это не было бы предпочтительным, потому что я хочу вернуть объекты с ленивыми прокси-серверами и т.д., А также создать более сложный запрос.

Ответы

Ответ 1

Вы можете использовать скалярную функцию SQL в своих критериях Where с CodeFirstStoreFunctions

Предполагая, что вы хотите сопоставить функцию SQL [dbo]. [LatLongDistanceCalc] и в соответствии с набором тестов:

public class MyDataContext: DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
       //...

       modelBuilder.Conventions.Add(new FunctionsConvention("dbo", this.GetType()));
    }

    // "CodeFirstDatabaseSchema" is a convention mandatory schema name
    // "LatLongDistanceCalc" is the name of your function

    [DbFunction("CodeFirstDatabaseSchema", "LatLongDistanceCalc")]
    public static int LatLongDistanceCalc(int fromLat, int fromLong,
                                                       int toLat, int toLong)
    {
       // no need to provide an implementation
       throw new NotSupportedException();
    }
}

будет:

context.Locations
       .Where(e => MyDataContext.LatLongDistanceCalc(e.Lat, e.Long, lat, long) >= 10)