【问题标题】:How to call a Scalar Function in Entity Framework Core如何在 Entity Framework Core 中调用标量函数
【发布时间】:2020-03-01 23:28:18
【问题描述】:

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

有人可以帮帮我吗?

提前致谢

【问题讨论】:

    标签: asp.net entity-framework asp.net-core entity-framework-core


    【解决方案1】:

    使用调用本身会引发异常,因为它实际上执行的是 C# 代码。建议抛出异常的原因正是这个,以避免无意使用,即直接调用它。该签名将由给定的 LINQ 提供程序解释并转换为正确的 SQL 语句。

    在 MS EF Core Database scalar function mapping

    它们可用于 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);
        }
    

    结果

    【讨论】:

    • 是的,它以这种方式工作,但我仍然有点困惑,因为在 DbContext 中,您使用Employees 类只是为了调用DbFunction。就我而言,该函数根本没有附加表格。必须调用表没有意义(我尝试了数据库中的每个表,它都有效)。
    • 找不到“dbo”列或用户定义的函数或聚合......
    • 就我而言,它总是抛出 throw new NotImplementedException();
    • 查看我对类似问题的回答,了解如何直接调用它:stackoverflow.com/a/68902584/6680521
    猜你喜欢
    • 2018-12-11
    • 2012-12-31
    • 2019-07-23
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2022-12-15
    • 2021-04-17
    • 2016-05-14
    相关资源
    最近更新 更多