Vb.net条件linq查询
在这个针对datatable的查询中,我尝试进行一些条件筛选。 仅当索引存在时,才应根据时间段(索引N)进行检查。(基本代码只有三个项字段,我已将它们转换为一个简单的列表)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
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)2和cond1)和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()