运行时的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

操作符——>字符串变量,所以不可能…

运行时的Where条件

您可以将==操作符视为接受两个字符串并返回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更适合于编译时查询。