web-dev-qa-db-ja.com

エンティティフレームワークコアでスカラー関数を呼び出す方法

次の この記事 Entity Framework Coreを使用して、内部SQL関数を自分のアプリケーションに呼び出しようとしていました

このように、コンテキスト内の静的メソッドを作成しました。

public class DbContext : DbContext
{
    public DbContext(DbContextOptions<DbContext> options) : base(options)
    {
    }

    [DbFunction("FN_ENCRYPT", "DBO")]
    public static string FN_ENCRYPT(string ENC)
    {
        throw new NotImplementedException();
    }
}
 _

この後、私はそれを呼び出す方法について少し混乱しているので、私はこのようにして試してみました(もちろん静的メソッドなのでとう)。

public string Encript(string Word)
{
    return DbContext.FN_ENCRYPT(Word);
}
 _

しかし、何を推測しますか?私は「いい」NotimplementedExceptionを受け取りました:)

誰かが私を助けますか?

前もって感謝します

6

呼び出し自体を使用すると、実際にC#コードを実行するため、例外がスローされます。例外をスローすることを推奨する理由は、不注意による使用を避けるため、すなわち直接呼び出すことによってこれを正確に推奨します。そのシグニチャは,与えられたLINQプロバイダで解釈され、適切なSQLステートメントに変換されます。

MS EFコアデータベーススカラー関数マッピング

それらはLINQクエリで使用され、SQLに翻訳されることができます

これが仕事のデモです。

モデルとDBContext

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime DOB  { get; set; }
}

public class MyDbContext:DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options):base(options)
    { }

    public DbSet<Employee> Employees { get; set; }

    [DbFunction("CalculateAge", "dbo")]
    public static int CalculateAge(DateTime dob)
    {
        throw new NotImplementedException();
    }
}
 _

そして使いやすいです

public IActionResult GetAge(int employeeId)
    {
        var query = _context.Employees
                .Where(x => x.Id == employeeId)
                .Select(d =>new
                { 
                    Name=d.Name,
                    DOB=d.DOB,
                    Age= MyDbContext.CalculateAge(d.DOB)
                }).ToList();
        return Json(query);
    }
 _

結果

enter image description here

1
Xueli Chen