Vb.net условный запрос linq - PullRequest
       1

Vb.net условный запрос linq

1 голос
/ 27 сентября 2011

В этом запросе к данным я пытаюсь выполнить некоторую условную фильтрацию.Проверка по временной полосе (индекс N) должна выполняться только при наличии индекса.(в базовом коде было только три поля элементов, я преобразовал их в простой список)

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()

Приведенный выше код вызывает исключение, если count = 1. Он выполняет код рядом с imeBands.Count> 1 чего не должно быть.Какое будет правильное решение для этого кода.

А пока я добавил простую функцию фильтра.

1 Ответ

3 голосов
/ 27 сентября 2011

Проблема в том, что вы используете And, когда вам нужно использовать AndAlso:

TimeBands.Count> 2 AndAlso dr.Field (Of Short) (fldStarttime)> = TimeBands (2) .StartTime (= cond1) И dr.Field (Of Short) (fldStarttime) <= TimeBands (2) .EndTime (= cond2) </p>

, поскольку And и AndAlso имеюттот же приоритет оператора , это оценивается слева направо следующим образом:

(TimeBands.Count> 2 AndAlso cond1) И cond2

And не закорачивает, т. е. правая часть выражения (cond2) всегда вычисляется, что дает исключение, когда TimeBands.Count <= 2.Измените все свои And с на AndAlso с, и все будет в порядке:

TimeBands.Count> 2 AndAlso cond1 AndAlso cond2

Альтернативой было бы поставить круглые скобки следующим образом:

TimeBands.Count> 2 AndAlso (cond1 И cond2)

но это просто потеря производительности.Поскольку cond1 и cond2 не имеют побочных эффектов, нет причин избегать короткого замыкания.По тем же причинам я рекомендую также изменить Or s на вариант с коротким замыканием OrElse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...