Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 运行时的where条件_C#_Linq - Fatal编程技术网

C# 运行时的where条件

C# 运行时的where条件,c#,linq,C#,Linq,我有密码 DataView res = (from a in dtvw.AsEnumerable() where a.Field<string>(creteriaattributeID) == rightval select a).AsDataView(); DataView res=(来自dtvw.AsEnumerable()中的a) 其中a.Field(creteriaattri

我有密码

 DataView res = (from a in dtvw.AsEnumerable()
                         where a.Field<string>(creteriaattributeID) == rightval
                        select a).AsDataView();
DataView res=(来自dtvw.AsEnumerable()中的a)
其中a.Field(creteriaattributeID)==rightval
选择a).AsDataView();
在这里,我想在运行时得到操作符(“==”),这可能吗

我试着用

where a.Field<string>(creteriaattributeID) + operator + rightval
其中a.Field(creteriaattributeID)+运算符+rightval

运算符-->字符串变量,因此它不可能。。。你能推荐其他方法吗?

你可以把
=
操作符看作是一个函数,它接受两个字符串并返回bool。 例如
Func
。 您是否可以使用这种类型的变量:

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();
Func equal=(a,b)=>{returna==b;};
Func notequal=(a,b)=>{返回a!=b;};
DataView res=(来自dtvw.AsEnumerable()中的a)
其中相等(a.字段(creteriaattributeID),rightval)
选择a).AsDataView();

您必须以友好的方式创建和表达

表达式lambda1;
如果(参数运算符==“=”){
ParameterExpression stringParam=表达式。参数(typeof(string),“a”);
ConstantPression criteriaValue=表达式.常量(rigthval,typeof(string));
BinaryExpression比较=表达式.Equals(stringParam,criteriaValue);
lambda1=
Lambda(
比较,,
新参数表达式[]{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();
DataTable dtvw=newdatatable();
DataView res=(来自dtvw.AsEnumerable()中的a)
其中a.字段(10)=“12”
选择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
}
DataView res;
开关(操作员)
{
案例“==”:
res=(来自dtvw.AsEnumerable()中的a)
其中a.Field(creteriaattributeID)==rightval
选择a).AsDataView();
打破
案例“!=”:
res=(来自dtvw.AsEnumerable()中的a)
其中a.Field(creteriaattributeID)!=rightval
选择a).AsDataView();
打破
//等等
}

您似乎正在使用LINQ到数据集。如果是这样的话,为什么不使用本机DataTable.Select(string)方法,在这个方法中,您仍然可以将运算符作为字符串传递。动态构建表达式的替代方法要痛苦得多。LINQ比运行时查询更适合编译时查询。

非常好。。但是我不能在运行时使用操作符吗?因为我需要编写更多的函数…你想使用哪些不同的运算符?运算符与自定义函数有何不同?对我来说,这是一样的,因此,我不确定您关心的是什么…+1@OP如果您想在运行时将用户输入转换为运算符,只需使用switch语句或等效语句将正确的运算符分配给Func变量。这应该适用于支持.net LINQ的每个.net运行时环境,我还没有测试过,但我相信它会给您一个很好的解决方案start@Abhijith纳亚克-这段代码在服务器上运行,因此特定的浏览器是完全无关的。相同的表达式在控制台应用程序或winform应用程序(=完全没有asp.net)中也适用。它在编译时会出现一些错误。。。你能调试并给出运行代码吗?你怎么知道应该使用哪个操作符?它是通过字符串传递的吗?我猜OP想在运行时决定使用哪个操作符。好的。。然后我会推荐和你写的一样的解决方案。
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
}