2015-04-08 4 views
15

Я пытаюсь что-то похожее на это:Entity Framework 6 Code First пользовательских функций

How to use scalar-valued function with linq to entity?

Однако я не использую 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? Я знаю, что вы можете создать ручной запрос, но это не было бы предпочтительным, потому что я хочу вернуть объекты с ленивыми прокси-серверами и т. Д., А также создать более сложный запрос.

ответ

24

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

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

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) 
+0

Я не уверен, как я этого не получил раньше, но это работает на 100%. Спасибо вам! – AndrewC

+2

Я хотел бы добавить, что это работает, если вы находитесь в пределах select/context. Если вы находитесь вне этого - это не сработает. –

+0

Я пытался использовать его с помощью функции Max, которую я создал, никаких входных параметров и пока не удался. Я всегда получаю исключение NotSupportedException. – yopez83

Смежные вопросы