我试图从.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);
}
答案 0 :(得分:4)
像这样的标量函数只能在LINQ to Entities查询中使用(不能在客户端执行,必须是SQL查询的一部分)。
这意味着您不能使用FindAsync
,所以改用FirstOrDefaultAsync
或SingleOrDefaultAsync
:
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);
}
这应该为您提供所需的东西,如果适合您,请告诉我!!欢呼,祝你有美好的一天。