如何在实体框架核心中调用标量函数

吉尔赫姆·戈尔菲托(Guilherme Golfetto)

本文之后,我尝试使用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 :)

有人可以帮我吗?

提前致谢

Xueli Chen

使用该调用本身会引发异常,因为它实际上执行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);
    }

结果

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章