Эквивалент функции SQL RIGHT в ядре Entity Framework - PullRequest
0 голосов
/ 07 сентября 2018

Я работаю с проектом Net Core, использующим инфраструктуру сущностей, базу данных mysql и инфраструктуру pomelo. Мне нужно выполнить этот запрос, чтобы сравнить последние X символов свойства в моей модели с шаблоном:

_context.Cars
.Where(c => EF.Functions.Like(c.CarName.ToString().Right(5), pattern))
.ToList();

Я хочу знать, существует ли какой-либо эквивалент функции SQL RIGHT в Entity Framework Core.

Заранее спасибо

1 Ответ

0 голосов
/ 07 сентября 2018

Поскольку в настоящее время нет ни метода CLR string, ни EF.Functions, называемого Right, ответ заключается в том, что EF Core в настоящее время не обеспечивает эквивалент функции SQL RIGHT.

К счастью, EF Core позволяет добавлять его с помощью представленного EF Core 2.0 Отображение скалярной функции базы данных .

Например, добавьте следующий класс:

using System;
using System.Linq;

namespace Microsoft.EntityFrameworkCore
{
    public static class MyDbFunctions
    {
        [DbFunction("RIGHT", "")]
        public static string Right(this string source, int length)
        {
            if (length < 0) throw new ArgumentOutOfRangeException(nameof(length));
            if (source == null) return null;
            if (length >= source.Length) return source;
            return source.Substring(source.Length - length, length);
        }

        public static void Register(ModelBuilder modelBuider)
        {
            foreach (var dbFunc in typeof(MyDbFunctions).GetMethods().Where(m => Attribute.IsDefined(m, typeof(DbFunctionAttribute))))
                modelBuider.HasDbFunction(dbFunc);
        }
    }
}

(Позже вы можете добавить больше таких функций, если это необходимо).

Затем добавьте вызов к Register из вашего контекста OnModelCreating переопределите:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // ...
    MyDbFunctions.Register(modelBuilder);
    // ...
}

И все готово. Теперь вы сможете использовать желаемое:

_context.Cars
.Where(c => EF.Functions.Like(c.CarName.ToString().Right(5), pattern))
.ToList();
...