无法得到双倍.尝试解析工作在Linq表达式树

本文关键字:工作 Linq 表达式 | 更新日期: 2023-09-27 18:02:14

我正在尝试创建一个动态where子句使用Linq表达式为一个可查询的数据源。我无法让TryParse函数在其中一个表达式中工作。下面是我要做的:

IQueryable<trial_global> globalTrials = _trialsRepository.GlobalDataFiltered(filterId).AsQueryable();
BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Static;
MethodInfo tryParseMethod = typeof(double).GetMethod("TryParse", bindingFlags, null, new Type[] { typeof(string), typeof(double).MakeByRefType() }, null);
Expression tempN = Expression.Parameter(typeof(double), "tempN");
Expression left = Expression.Call(tryParseMethod, new[] { metricReference, tempN });
Expression right = Expression.Constant(true);
Expression predicateBody = Expression.Equal(left, right);
MethodCallExpression whereCallExpression = Expression.Call(
                            typeof(Queryable),
                            "Where",
                            new Type[] { globalTrials.ElementType },
                            globalTrials.Expression,
                            Expression.Lambda<Func<trial_global, bool>>(predicateBody, new ParameterExpression[] { pe })
                            );
var results = globalTrials.Provider.CreateQuery<trial_global>(whereCallExpression);

一切工作正常,直到results被分配,我得到以下错误:

variable 'tempN' of type 'System.Double' referenced from scope '', but it is not defined

我在这里错过了什么?我怀疑它与double中的第二个参数有关。TryParse函数是out参数。

更新:

我通过创建一个静态函数来解决这个问题,该函数执行TryParse并从表达式中调用这个静态函数:

public static bool IsStringNumeric(string checkStr)
{
    double num = 0;
    return double.TryParse(checkStr, out num);
}
public IQueryable<trial_global> GetTrials(IQueryable<trial_global> globalTrials, Metric metric)
{
    ParameterExpression pe = Expression.Parameter(typeof(trial_global), "trial_global");
    MemberExpression metricReference = Expression.Property(pe, metric.metric_name);
    Expression predicateBody = Expression.Call(typeof(GlobalTrialsRepository).GetMethod("IsStringNumeric", new Type[] { typeof(string) }), metricReference);
    MethodCallExpression whereCallExpression = Expression.Call(
                typeof(Queryable),
                "Where",
                new Type[] { globalTrials.ElementType },
                globalTrials.Expression,
                Expression.Lambda<Func<trial_global, bool>>(predicateBody, new ParameterExpression[] { pe })
                );
    return globalTrials.Provider.CreateQuery<trial_global>(whereCallExpression);
}

这个方法可以吗?有人认为这样做有什么缺点吗?

无法得到双倍.尝试解析工作在Linq表达式树

尝试解析使用out参数进行检查。使用tryparse创建一个扩展方法,然后从linq

调用该扩展方法

Linq查询被延迟,直到对其调用ToXXXX()。因此,您可以将Where语句定义为Linq方法链,然后只需调用。tolist或其他方法来获取值。