2015-04-08 23 views
15

Sto cercando qualcosa di simile a questo:Entity Framework 6 Codice Prima personalizzato

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

Tuttavia non sto usando EDMX, ma invece basta DbContext e il codice prima.

ho incontrato questo:

https://codefirstfunctions.codeplex.com/

Ma l'uso non è adatta. Quello che sto cercando di realizzare è quello di essere in grado di fare questo:

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

Dove si chiamerà una funzione scalare (LatLongDistanceCalc) su SQL Server.

C'è un modo per farlo senza utilizzare EDMX? So che è possibile costruire una query manuale ma questo non sarebbe preferibile perché voglio riportare le entità con proxy lazy loading ecc. E creare una query più complessa.

risposta

24

Si dovrebbe essere in grado di utilizzare una funzione SQL scalare nelle vostre Where criteri con CodeFirstStoreFunctions

Supponendo che si desidera mappare funzione SQL [dbo] [LatLongDistanceCalc], e secondo 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(); 
    } 
} 

l'utilizzo sarebbe quindi:

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

Non sono sicuro di come non l'ho ricevuto prima, ma funziona al 100%. Grazie! – AndrewC

+2

Vorrei aggiungere che questo funziona se ci si trova all'interno della select/context. Se non ci sei, non funzionerà. –

+0

Ho cercato di usarlo con una funzione Max che ho creato, nessun parametro di input e finora nessun successo. Ottengo sempre NotSupportedException. – yopez83

Problemi correlati