2015-04-08 18 views
15

Próbuję coś podobnego do tego:Entity Framework 6 Kod Najpierw Niestandardowe funkcje

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

Jednak nie używam EDMX, ale zamiast po prostu DbContext i kod pierwszy.

natknąłem to:

https://codefirstfunctions.codeplex.com/

Ale użycie nie jest odpowiedni. Co staram się osiągnąć to, aby móc to zrobić:

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

Gdzie będzie wywołać funkcję skalarną (LatLongDistanceCalc) na SQL Server.

Czy można to zrobić bez korzystania z EDMX? Wiem, że można skonstruować zapytanie ręczne, ale nie byłoby to zalecane, ponieważ chcę przywrócić elementy z leniwymi serwerami ładującymi itp., Jak również budowanie bardziej złożonego zapytania.

Odpowiedz

24

powinny mieć możliwość korzystania z funkcji skalarnej SQL w swoim Where criterias z CodeFirstStoreFunctions

Zakładając chcesz mapować funkcji SQL [dbo] [LatLongDistanceCalc], a według 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(); 
    } 
} 

użycie byłoby wtedy:

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

Nie jestem pewien, jak nie dostałem tego wcześniej, ale działa to w 100%. Dzięki Ci! – AndrewC

+2

Chciałbym dodać, że działa to, jeśli jesteś w selekcji/kontekście. Jeśli jesteś poza nim - to nie zadziała. –

+0

Próbowałem go użyć z funkcją Max, którą utworzyłem, brak parametrów wejściowych i jak dotąd brak sukcesu. Zawsze otrzymuję wyjątek NotSupportedException. – yopez83

Powiązane problemy