Поскольку в настоящее время нет ни метода 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();