我有一个代码
DataView res = (from a in dtvw.AsEnumerable()
where a.Field<string>(creteriaattributeID) == rightval
select a).AsDataView();
在这里,我想在运行时获取运算符(“==”)是否可能?
我尝试使用
where a.Field<string>(creteriaattributeID) + operator + rightval
运营商 - &gt;字符串变量所以它不可能...你能建议任何其他方法......
答案 0 :(得分:2)
您可以将==
运算符视为带有两个字符串并返回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();
答案 1 :(得分:0)
你必须动态创建和表达
ý。
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();
答案 2 :(得分:0)
不明白这个问题,代码编译得很完美。
DataTable dtvw = new DataTable();
DataView res = (from a in dtvw.AsEnumerable()
where a.Field<string>(10) == "12"
select a).AsDataView();
答案 3 :(得分:0)
没有那么多运营商,为什么不对它进行硬编码呢?
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
}
答案 4 :(得分:0)
您似乎正在使用LINQ to DataSet。如果是这种情况,为什么不使用本机DataTable.Select(string)方法,您可以将运算符作为字符串传递。动态构建表达式的替代方案更加痛苦。 LINQ比运行时查询更适合编译时间查询。