Метод DatePart в Entity Framework Core 3.0 - PullRequest
0 голосов
/ 02 ноября 2019

Как использовать такие методы, как DatePart или TruncateTime и т. Д. В Entity Framework Core 3.0? В Entity Framework 6.3.0 можно было вызвать, например,

DbFunctions.TruncateTime

, но сейчас такого метода нет. Я обнаружил, что что-то подобное можно сделать с помощью кода, показанного ниже, но мне не удалось заставить его работать, так как конструктор SqlFragmentExpression является внутренним:

public int? DatePart(string datePartArg, DateTime? date) => throw new Exception();

public void OnModelCreating(DbModelBuilder modelBuilder) {
    var methodInfo = typeof(DbContext).GetRuntimeMethod(nameof(DatePart), new[] { typeof(string), typeof(DateTime) });
    modelBuilder
        .HasDbFunction(methodInfo)
        .HasTranslation(args => new SqlFunctionExpression(nameof(DatePart), typeof(int?), new[]
                {
                        new SqlFragmentExpression(args.ToArray()[0].ToString()),
                        args.ToArray()[1]
                }));
}

Вот простой запрос LINQ, который япытаюсь заставить работать:

context.Books.Any(x => DbFunctions.TruncateTime(x.date) == data.Date);

Есть ли какой-то другой способ сделать это или, по крайней мере, кто-то работает над добавлением этих функций?


Редактировать 1

Чтобы прояснить мою проблему - мне нужно сгруппировать строки по результату DatePart позже.

1 Ответ

1 голос
/ 02 ноября 2019

Из этого вопроса я кое-что узнал. Следующий оператор linq должен работать для вас:

context.Books.Any(x => x.date.Date == data.Date);

Но некоторые функции могут быть доступны из ядра EF. EG:

var dbf = EF.Functions;
_DB.Books.Any(x => EF.Functions.Contains(x.Name, "Galaxy"));

Начиная с EF core 2.0, имеется также функция скалярной функции , которая позволяет отображать функции Linq в функции Scalar Database. Смотри https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-2.0

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