运行时的条件

时间:2011-10-10 06:38:35

标签: c# linq

我有一个代码

 DataView res = (from a in dtvw.AsEnumerable()
                         where a.Field<string>(creteriaattributeID) == rightval
                        select a).AsDataView();

在这里,我想在运行时获取运算符(“==”)是否可能?

我尝试使用

where a.Field<string>(creteriaattributeID) + operator + rightval

运营商 - &gt;字符串变量所以它不可能...你能建议任何其他方法......

5 个答案:

答案 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比运行时查询更适合编译时间查询。