EF Core 3.0 DbFunctionBuilder HasTranslation仅接受SqlExpression而不接受表达式

时间:2019-10-29 20:32:26

标签: c# entity-framework-core

我在本地环境中使用EF Core 2.2.6运行以下代码:

@Query(value = "select u from User u where u.role = :#{query.parameters.role}")
Set<User> getAllUsers();

完整的代码和源文章可以在这里找到: https://entityframeworkcore.com/en/knowledge-base/54920200/entity-framework

升级到EF Core 3.0后,现在抛出此错误:

public static class GuidFunctions
{
    public static bool IsGreaterThan(this Guid left, Guid right) => left.CompareTo(right) > 0;
    public static bool IsGreaterThanOrEqual(this Guid left, Guid right) => left.CompareTo(right) >= 0;
    public static bool IsLessThan(this Guid left, Guid right) => left.CompareTo(right) < 0;
    public static bool IsLessThanOrEqual(this Guid left, Guid right) => left.CompareTo(right) <= 0;
    public static void Register(ModelBuilder modelBuilder)
    {
        RegisterFunction(modelBuilder, nameof(IsGreaterThan), ExpressionType.GreaterThan);
        RegisterFunction(modelBuilder, nameof(IsGreaterThanOrEqual), ExpressionType.GreaterThanOrEqual);
        RegisterFunction(modelBuilder, nameof(IsLessThan), ExpressionType.LessThan);
        RegisterFunction(modelBuilder, nameof(IsLessThanOrEqual), ExpressionType.LessThanOrEqual);
    }
    static void RegisterFunction(ModelBuilder modelBuilder, string name, ExpressionType type)
    {
        var method = typeof(GuidFunctions).GetMethod(name, new[] { typeof(Guid), typeof(Guid) });
        modelBuilder.HasDbFunction(method).HasTranslation(parameters =>
        {
            var left = parameters.ElementAt(0);
            var right = parameters.ElementAt(1);
            return Expression.MakeBinary(type, left, right, false, method);
        });
    }
}

在检查EF Core v2.2.6和EF Core v3.0的方法签名时,我注意到HasTranslation函数类型已从Expression更改为SqlExpression,从而使返回的类型不兼容(Expression.MakeBinary返回的BinaryExpression)。 / p>

EF Core v2.2.6 HasTranslation(Func,Expression>)

EF Core v3.0 HasTranslation(Func,SqlExpression>)

有什么解决方法可以使该解决方案再次与EF Core 3.0一起使用?

0 个答案:

没有答案