运行时的Where条件
本文关键字:条件 Where 运行时 | 更新日期: 2023-09-27 18:10:45
我有代码
DataView res = (from a in dtvw.AsEnumerable()
where a.Field<string>(creteriaattributeID) == rightval
select a).AsDataView();
这里,我想在运行时得到运算符("== ")是可能的吗?
我试过使用
where a.Field<string>(creteriaattributeID) + operator + rightval
操作符——>字符串变量,所以不可能…
您可以将==
操作符视为接受两个字符串并返回bool值的函数。比如Func<string, string, bool>
。你能不能只使用这种类型的变量:
Func<string, string, bool> equal = (a,b) => { return a == b; };
Func<string, string, bool> notequal = (a,b) => { return a != b; };
DataView res = (from a in dtvw.AsEnumerable()
where equal(a.Field<string>(creteriaattributeID), rightval)
select a).AsDataView();
你必须动态地创建和表达
即
Expression<Func<int, bool>> lambda1;
if(paramOperator=="=="){
ParameterExpression stringParam = Expression.Parameter(typeof(string), "a");
ConstantExpression criteriaValue = Expression.Constant(rigthval, typeof(string));
BinaryExpression comparison= Expression.Equals(stringParam , criteriaValue );
lambda1 =
Expression.Lambda<Func<string, bool>>(
comparison,
new ParameterExpression[] { stringParam });
}
DataView res = dtvw.AsEnumerable().Where(lamda1.Compile()).AsDataView();
我不明白这个问题,代码对我来说编译得很好。
DataTable dtvw = new DataTable();
DataView res = (from a in dtvw.AsEnumerable()
where a.Field<string>(10) == "12"
select a).AsDataView();
没有那么多操作符,为什么不硬编码呢?
DataView res;
switch (theOperator)
{
case "==":
res = (from a in dtvw.AsEnumerable()
where a.Field<string>(creteriaattributeID) == rightval
select a).AsDataView();
break;
case "!=":
res= (from a in dtvw.AsEnumerable()
where a.Field<string>(creteriaattributeID) != rightval
select a).AsDataView();
break;
// and so on
}
看起来您正在处理LINQ到数据集。如果是这种情况,为什么不使用本地的DataTable.Select(string)方法,在这种方法中,您可以将操作符作为字符串传递。动态构建表达式的替代方法要痛苦得多。比起运行时查询,LINQ更适合于编译时查询。