Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/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
Vb.net条件linq查询_Vb.net_Linq_If Statement - Fatal编程技术网

Vb.net条件linq查询

Vb.net条件linq查询,vb.net,linq,if-statement,Vb.net,Linq,If Statement,在这个针对datatable的查询中,我尝试进行一些条件筛选。 仅当索引存在时,才应根据时间段(索引N)进行检查。(基本代码只有三个项字段,我已将它们转换为一个简单的列表) Dim res作为数据表= ( 作为dtTimedRow.AsEnumerable()中的数据行从dr开始 选择dr 哪里 (TimeBands.Count>0,并且 dr.Field(短)(fldStarttime)>=时区(0)。开始时间 和费尔德博士(短期)(FLDStartime)1和 dr.Field(短)(fld

在这个针对datatable的查询中,我尝试进行一些条件筛选。 仅当索引存在时,才应根据时间段(索引N)进行检查。(基本代码只有三个项字段,我已将它们转换为一个简单的列表)

Dim res作为数据表=
(
作为dtTimedRow.AsEnumerable()中的数据行从dr开始
选择dr
哪里
(TimeBands.Count>0,并且
dr.Field(短)(fldStarttime)>=时区(0)。开始时间
和费尔德博士(短期)(FLDStartime)1和
dr.Field(短)(fldStarttime)>=时间段(1)。开始时间
以及费尔德博士(短期)(飞行起始时间)2及
dr.Field(短)(fldStarttime)>=时间段(2)。开始时间
和dr.Field(Of Short)(fldStarttime)1,这是不应该的。这段代码的正确解决方案是什么


同时,我还添加了一个简单的过滤功能。

问题在于,您应该在什么时候使用:

时区。计数>2
AndAlsodr.Field(Of Short)(fldStarttime)>=时区(2)。开始时间(=cond1)
dr.Field(短)(fldstartime)2cond1)cond2

不会短路,即表达式(cond2)的右侧总是被计算,当
时区时产生异常。计数2和alsocond1和alsocond2

另一种方法是插入如下括号:

时间段。计数>2并且也(第1步和第2步)


但这只是在浪费性能。既然cond1和cond2没有副作用,就没有理由避免短路。出于同样的原因,我建议也将您的
s更改为短路变体
OrElse

,您比我强!我本打算提出同样的建议。哦,我应该看到那个我自己
Dim res As DataTable =
    (
        From dr As DataRow In dtTimedRow.AsEnumerable()
        Select dr
        Where
        (TimeBands.Count > 0 AndAlso
         dr.Field(Of Short)(fldStarttime) >= TimeBands(0).StartTime
         And dr.Field(Of Short)(fldStarttime) <= TimeBands(0).EndTime
        ) Or
        (TimeBands.Count > 1 AndAlso
         dr.Field(Of Short)(fldStarttime) >= TimeBands(1).StartTime
         And dr.Field(Of Short)(fldStarttime) <= TimeBands(1).EndTime
        ) Or
        (TimeBands.Count > 2 AndAlso
         dr.Field(Of Short)(fldStarttime) >= TimeBands(2).StartTime
         And dr.Field(Of Short)(fldStarttime) <= TimeBands(2).EndTime)
    ).CopyToDataTable()