我正在使用实体框架,mysql数据库和pomelo框架进行Net Core项目。我需要执行此查询,以便将我模型中属性的最后X个字符与一个模式进行比较:
_context.Cars
.Where(c => EF.Functions.Like(c.CarName.ToString().Right(5), pattern))
.ToList();
我想知道实体框架核心中是否有等效的SQL RIGHT函数。
预先感谢
答案 0 :(得分:5)
由于当前没有称为string
的CLR EF.Functions
和Right
方法,因此答案是EF Core当前不提供等效的SQL RIGHT
函数。
幸运的是,EF Core允许您使用引入的Database scalar function mapping 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();
答案 1 :(得分:0)
使用以下内容:
_context.Cars.Where(w => DbFunctions.Right(w.CarName,5)==pattern).ToList();