![](/img/trans.png)
[英]Linq expression - “variable” of type 'System.Data.DataRow' referenced from scope “” but it is not defined
[英]Variable '' of type 'System.Data.DataRow' referenced from scope '', but it is not defined
我正在尝试构建通用函数以在DataRows
上应用规则。
但是我在运行程序时遇到以下错误
这是我的代码。
public Func<T, bool> CompileRuleDataRow<T>(Rule r)
{
var paramUser = Expression.Parameter(typeof(T));
Expression expr = BuildExprDataRow<T>(r, paramUser);
// build a lambda function User->bool and compile it
//Expression.Lambda<Func<T, bool>>(
return Expression.Lambda<Func<T, bool>>(expr, paramUser).Compile();
}
构建表达的功能。
public Expression BuildExprDataRow<T>(Rule r, ParameterExpression param)
{
ParameterExpression objExpr = Expression.Parameter(typeof(string));
string defaultMember = "Item";
ConstantExpression indexExpr = Expression.Constant(r.MemberName);
Expression leftIndexAccessExpr = Expression.Property(objExpr, defaultMember, indexExpr);
ExpressionType tBinary;
// is the operator a known .NET operator?
ExpressionType.TryParse(r.Operator, out tBinary);
var right = Expression.Constant(r.TargetValue);
// use a binary operation, e.g. 'Equal' -> 'u.Age == 15'
return Expression.MakeBinary(tBinary, leftIndexAccessExpr, right);
}
并且我在main方法中以这种方式调用它。
var rule = new Rule("Name", "Equal", "3");
Func<DataRow, bool> compiledRuleDataRow = CompileRuleDataRow<DataRow>(rule);
DataTable dt = new DataTable();
dt.Columns.Add("Id");
dt.Columns.Add("Name");
dt.Columns.Add("Address");
for (int i = 0; i < 100000; i++)
{
dt.Rows.Add(i.ToString(), i.ToString(), i.ToString());
}
//I want to do something like this.
DataRow[] drFiltered = dt.Select().Where(r => compiledRuleDataRow(r)).ToArray();
下面是我的Rule
类
public class Rule
{
public string MemberName { get; set; }
public string Operator { get; set; }
public string TargetValue { get; set; }
public Rule(string MemberName, string Operator, string TargetValue)
{
this.MemberName = MemberName;
this.Operator = Operator;
this.TargetValue = TargetValue;
}
}
当我运行此代码时,出现以下错误。
范围“”引用了类型为“ System.Data.DataRow”的变量“,但未定义
说明:执行当前Web请求期间发生未处理的异常。 请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。
异常详细信息:System.InvalidOperationException:从范围”引用的类型为“ System.Data.DataRow”的变量“,但未定义
有人可以帮我吗?
像@svick一样,我从发布的代码中得到了另一个错误。
无论如何,该BuildExprDataRow
方法存在两个问题。 首先,它不使用传递的param
参数。 其次,属性值未正确转换,因此二进制运算符不起作用。
这是固定方法:
public Expression BuildExprDataRow<T>(Rule r, ParameterExpression param)
{
var right = Expression.Constant(r.TargetValue);
var left = Expression.Convert(
Expression.Property(param, "Item", Expression.Constant(r.MemberName)),
right.Type);
var comparison = (ExpressionType)Enum.Parse(typeof(ExpressionType), r.Operator);
return Expression.MakeBinary(comparison, left, right);
}
顺便说一句,该方法内部均未使用通用参数T
,因此您可以将其删除(使该方法变为非通用)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.