Пока не получена «официальная» поддержка, вы можете отобразить JSON_VALUE
, используя EF Core 2.0, представленный Отображение скалярной функции базы данных .
Например, добавьте следующий статический метод в производный от контекста класс или в отдельный статический класс, как показано ниже:
public static class MyDbFunctions
{
[DbFunction("JSON_VALUE", "")]
public static string JsonValue(string source, string path) => throw new NotSupportedException();
}
и, если он находится в отдельном классе, добавьте в свой контекст следующее OnModelCreating
переопределение (не требуется, если метод находится в контексте):
modelBuilder.HasDbFunction(() => MyDbFunctions.JsonValue(default(string), default(string)));
Теперь вы можете использовать его внутри запросов LINQ to Entities, аналогичных EF.Functions
. Просто обратите внимание, что функция возвращает string
, поэтому для того, чтобы обмануть компилятор для «приведения» его к числовому типу, вы можете использовать метод двойного приведения, показанный ниже (протестирован и работает в EF Core 2.1.2):
var query = db.Set<Setting>()
.Where(s => (int)(object)MyDbFunctions.JsonValue(s.Value, "lax $.Name") > 1);
, что соответствует желаемому
WHERE JSON_VALUE([Value], 'lax $.Name') > 1
Другой (возможно, более безопасный по типу) способ выполнить преобразование - использовать методы класса Convert
(неожиданно поддерживаемые поставщиком SqlServer EF Core):
var query = db.Set<Setting>()
.Where(s => Convert.ToInt32(MyDbFunctions.JsonValue(s.Value, "lax $.Name")) > 1);
, что переводится как
WHERE CONVERT(int, JSON_VALUE([Value], 'lax $.Name')) > 1