500 Ошибка вызова функции скалярной базы данных из .net core 2.1 - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь вызвать скалярную функцию, которая есть в моей базе данных, из моего .NET Core 2.1 Web API, чтобы получить директора сотрудника;функция в моей базе данных ожидает идентификатор сотрудника в качестве ввода и возвращает идентификатор директора.Работает просто отлично и называется dbo.fn_GetDirectorID.

Я хотел создать конечную точку в своем веб-API для вызова этой функции, получить directorID и затем отправить объект сотрудника этого директора моему клиенту.Итак, я искал онлайн-ресурсы, и я наткнулся на этот Я был похож на вау, это возможно, так что давайте попробуем это, поэтому я следовал их руководству. Теперь у меня есть функция базы данных 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 голосов
/ 30 ноября 2018

Подобные скалярные функции могут использоваться только внутри запроса 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)));

Для получения дополнительной информации см. Отображение скалярной функции базы данных Документация.

0 голосов
/ 30 ноября 2018

Я бы попробовал запрос 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);
    }

это должно дать вам то, что вам нужно, дайте мне знать, если это работает для вас!ура и хорошего дня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...