我在本地环境中使用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一起使用?