gpt4 book ai didi

c# - 无法让 double.TryParse 在 Linq 表达式树中工作

转载 作者:行者123 更新时间:2023-11-30 12:58:05 26 4
gpt4 key购买 nike

我正在尝试使用 Linq 表达式为 IQueryable 数据源创建动态 where 子句。我无法让 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

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

更新:

我通过创建一个执行 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);
}

这个方法可以吗?有没有人看到这样做有什么缺点?

最佳答案

Tryparse 使用 out 参数进行检查。使用 tryparse 创建扩展方法,然后从 linq 调用扩展方法

关于c# - 无法让 double.TryParse 在 Linq 表达式树中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31350838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com