一尘不染

实体框架6代码优先自定义函数

c#

我正在尝试类似的操作:

如何将带有linq的标量值函数用于实体?

但是我不使用EDMX,而是先使用DbContext和代码。

我遇到了这个:

https://codefirstfunctions.codeplex.com/

但是这种用法是不合适的。我试图实现的目标是能够做到这一点:

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

它会在SQL Server上调用标量函数(LatLongDistanceCalc)的位置。

有没有不使用EDMX的方法吗?我知道您可以构造一个手动查询,但这不是可取的,因为我想带回带有延迟加载代理等的实体以及建立一个更复杂的查询。


阅读 221

收藏
2020-05-19

共1个答案

一尘不染

您应该可以在CodeFirstStoreFunctionsWhere条件中使用标量SQL函数

假设您要映射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)
2020-05-19