Лучшие практики вызова скалярных функций с помощью Entity Framework Core (2.1) - PullRequest
0 голосов
/ 03 июля 2018

Мне часто нужно вызывать скалярные функции, определенные на SQL Server, из моих веб-приложений (ASP.NET Core / EF Core). Поскольку эти функции являются простыми вспомогательными функциями, и я также использую их много, я использую общий шаблон для вызова этих скалярных функций - с помощью новых типов запросов, доступных в EF Core 2.1. Поскольку я относительно новичок в EF Core, мой вопрос в том, может ли этот шаблон вызвать проблемы и / или есть ли лучшее решение или лучшая практика для вызова скалярных функций. Решение работает, и я пока не вижу никаких проблем, но, например, мне было интересно, может ли использование одного и того же типа запроса для разных функций привести к неожиданным значениям или странному поведению из-за поведения кэширования / отслеживания и т. Д. В EF Core - это скорее чувство кишки.

Итак, вот схема: Вместо того, чтобы определять разные типы сущностей для каждой скалярной функции, я просто определяю один общий тип:

public class PrimitiveDto<T>
{
    public T Value { get; set; }
}

В моем классе контекста я регистрирую эти типы для каждого возвращаемого типа, который я ожидаю от скалярных функций, которые я хочу использовать - поэтому для всех скалярных функций, возвращающих 'int', у класса контекста будет одна дополнительная запись, подобная этой:

public virtual DbQuery<PrimitiveDto<int>> BasicIntDto { get; set; }

В каждой части приложения, где я хочу вызвать скалярную функцию, возвращающую 'int', я просто использую один и тот же шаблон:

context.BasicIntDto.FromSql("SELECT <FUNCTION> AS Value")

Используя этот шаблон, я могу вызывать любое количество функций одинаково, без определения дополнительных типов или расширения класса контекста.

Пожалуйста, дайте мне знать, могу ли я наткнуться на эту ловушку. Большое спасибо.

1 Ответ

0 голосов
/ 15 января 2019

К сожалению, кажется, что эта функция была оставлена ​​в стороне: https://github.com/aspnet/EntityFrameworkCore/issues/9810

Опция заключается в переносе вызовов функций в статическом классе с использованием небольшой таблицы, которая никогда не бывает пустой:

public static class DbFunctions
{
   public static decimal MyFunctionABC(int param1, int param2)
   {
       using (var db = new MyDbContext())
       {
        return db.table.Take(1).Select(t => MyDbContext.MyFunctionABC(x, y)).Single();
       }
    }
 }

Тогда вы можете позвонить DbFunctions.MyFunctionABC(x,y);

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