Search code examples
c#linqentity-frameworkentity-framework-6

Entity Framework 6 Code First Custom Functions


I'm trying something similar to this:

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

However I'm not using EDMX, but instead just DbContext and code first.

I've come across this:

https://codefirstfunctions.codeplex.com/

But the usage isn't suitable. What I am trying to achieve is to be able to do this:

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

Where it will call a scalar function (LatLongDistanceCalc) on SQL Server.

Is there any way to do this without using EDMX? I know that you can construct a manual query but this wouldn't be prefereable because I want to bring back entities with lazy loading proxies etc as well as building up a more complex query.


Solution

  • You should be able to use a scalar SQL function in your Where criterias with CodeFirstStoreFunctions

    Assuming you want to map SQL function [dbo].[LatLongDistanceCalc], and according to 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();
        }
    }
    

    usage would then be:

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