【问题标题】:.NET Core Expression DbFunctions DiffDays.NET Core 表达式 DbFunctions DiffDays
【发布时间】:2020-02-02 18:28:50
【问题描述】:

我有一个我为日期过滤器编写的扩展,它使用 .NET 的 DiffDays 方法。 在 .NET Core 中,EF.Functions 被 DbFunctions 取代,所以无法执行。

我的 .NET 代码

 private static (ParameterExpression param, MemberExpression prop) QueryExpressions<Entity>(IQueryable<Entity> query, string property)
        {
            var param = Expression.Parameter(query.ElementType, "x");
            MemberExpression prop;

            if (property.Contains('.'))
            {
                string[] childProperties = property.Split('.');

                prop = Expression.Property(param, childProperties[0]);

                for (int i = 1; i < childProperties.Length; i++)
                    prop = Expression.Property(prop, childProperties[i]);
            }
            else
                prop = Expression.Property(param, property);

            return (param, prop);
        }

 public static IQueryable<Entity> DiffDaysLessThan<Entity>(this IQueryable<Entity> query, string property, object value)
        {
            var methodInfo = typeof(DbFunctions).GetMethod("DiffDays", new Type[] { typeof(DateTime?), typeof(DateTime?) });

            (ParameterExpression param, MemberExpression prop) = QueryExpressions(query, property);

            var left = Expression.Call(
                methodInfo,
                Expression.Convert(Expression.Constant(value), typeof(DateTime?)), Expression.Convert(prop, typeof(DateTime?)));
            var right = Expression.Convert(Expression.Constant(0), typeof(int?));

            var body = Expression.LessThanOrEqual(left, right);

            return query.Where(Expression.Lambda<Func<Entity, bool>>(body, param));
        }

.NET 核心

   public static IQueryable<Entity> DiffDaysLessThan<Entity>(this IQueryable<Entity> query, string property, object value)
        {

            var methodInfo = typeof(SqlServerDbFunctionsExtensions).GetMethod("DateDiffSecond", new Type[] { typeof(DbFunctions), typeof(DateTime?), typeof(DateTime?) });

            (ParameterExpression param, MemberExpression prop) = QueryExpressions(query, property);

            var left = Expression.Call(
                methodInfo,
                Expression.Convert(Expression.Constant(value), typeof(DateTime?)), Expression.Convert(prop, typeof(DateTime?)));
            var right = Expression.Convert(Expression.Constant(0), typeof(int?));

            var body = Expression.LessThanOrEqual(left, right);

            return query.Where(Expression.Lambda<Func<Entity, bool>>(body, param));
        }

在调用方法时,我不能等于 Expression.Call 端的 typeof (DbFunctions) 参数。

错误

System.ArgumentException:为调用方法“System.Nullable1[System.Int32] DateDiffSecond(Microsoft.EntityFrameworkCore.DbFunctions, System.Nullable1[System.DateTime], System.Nullable`1[System.DateTime])”(参数“方法”)提供的参数数量不正确

【问题讨论】:

    标签: linq entity-framework-core ef-core-2.2 .net-core-3.0


    【解决方案1】:

    EF Core 函数是由EF.Functions 属性返回的DbFunctions 类的扩展 方法。因此,尽管未使用,但您必须在调用它们时传递DbFunctions 类型的第一个参数,例如

    var left = Expression.Call(
        methodInfo,
        Expression.Constant(EF.Functions, typeof(DbFunctions)), // <--
        Expression.Convert(Expression.Constant(value), typeof(DateTime?)),
        Expression.Convert(prop, typeof(DateTime?)));
    

    【讨论】:

    • 我想说我已经使用“Expression.Constant (EF.Functions)”解决了它,我看到了你的答案。 :D 我也试过不输入“typeof(DbFunctions)”,它可以工作,但我想你的解决方案要好得多。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多