web-dev-qa-db-ja.com

Entity Framework 6コードファーストカスタム関数

私はこれに似たものを試しています:

エンティティへの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を使用せずにこれを行う方法はありますか?手動クエリを作成できることは知っていますが、レイジーロードプロキシなどでエンティティを戻し、より複雑なクエリを構築したいので、これは好ましくありません。

17
AndrewC

CodeFirstStoreFunctions を使用して、Where基準でスカラー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)
30
jbl