500从.net Core 2.1调用标量数据库函数时出错

时间:2018-11-30 19:59:13

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

我试图从.NET Core 2.1 Web API调用数据库中的标量函数,以获取一名员工的主管;我数据库中的函数期望将雇员ID作为输入,并返回主管的ID。它工作正常,被称为dbo.fn_GetDirectorID

我想在我的Web API中创建一个端点来调用此函数以获取directorID,然后将该控制器的雇员对象发回给我的客户。因此,我一直在寻找在线资源,遇到this就像是哇,这很可能,所以让我们尝试一下,这样我就可以按照他们的教程进行操作,现在在我的上下文中有一个GetDirectorID数据库功能,例如所描述的链接

[DbFunction("fn_GetDirectorID", "dbo")]
public static int GetDirectorID(int id)
{
    throw new NotImplementedException();
}

然后在我的控制器中,我要做这样的事情

[HttpGet("GetDirector/{id}")]
public async Task<IActionResult> GetDirector([FromRoute] int id)
{
    var directorID = KPContext.GetDirectorID(id);

    var director = await _context.Employees.FindAsync(directorID);

    if (director == null)
    {
        return NotFound();
    }

    return Ok(director);
}

但是当我打电话给我时,我因为抛出新的NotIMplementedException而抛出错误,但是我不确定在这里做什么,因为本教程说这应该调用函数并起作用。我也是

int directorID = KPContext.GetDirectorID(id)

有人可以帮忙吗?我将不胜感激。

我也刚刚尝试过

 [HttpGet("GetDirector/{id}")]
        public async Task<IActionResult> GetDirector([FromRoute] int id)
        {


            var director = await _context.Employees.FindAsync(KPContext.GetDirectorID(id));

            if (director == null )
            {
                return NotFound();
            }

            return Ok(director);
        }

2 个答案:

答案 0 :(得分:4)

像这样的标量函数只能在LINQ to Entities查询中使用(不能在客户端执行,必须是SQL查询的一部分)。

这意味着您不能使用FindAsync,所以改用FirstOrDefaultAsyncSingleOrDefaultAsync

var director = await _context.Employees
    .SingleOrDefaultAsync(e => e.Id == KPContext.GetDirectorID(id));

FindAsync相比,它还有一个优点,那就是您可以渴望加载(Include / ThenInclude)相关数据。

还请注意(链接中未提及),如果标量函数是在目标DbContext派生类之外的其他类中定义的,则它将不会自动注册,因此您需要添加在您的DbContext派生类OnModelCreating上进行类似的替换(如果它当然不是KPContext类):

modelBuilder.HasDbFunction(() => KPContext.GetDirectorID(default(int)));

有关更多信息,请参见Database scalar function mapping文档。

答案 1 :(得分:1)

我将尝试linq查询,因为我认为尚不支持纯EF。

   [HttpGet("GetDirector/{id}")]
    public async Task<IActionResult> GetDirector([FromRoute] int id)
    {
        var director =  from p in _context.Employees where p.EmployeeId == KPContext.GetDirectorID(id) select p;

        if (director == null )
        {
            return NotFound();
        }

        return Ok(director);
    }

这应该为您提供所需的东西,如果适合您,请告诉我!!欢呼,祝你有美好的一天。