Использование инструкции Case с записью Int из таблицы

#vb.net #linq #linq-to-sql #case

#vb.net #linq #linq-to-sql #case

Вопрос:

Каков наилучший способ сравнить запись Int из таблицы в инструкции case?

Использование SQL server 2008 R2, Visual Basic Express с LINQ для SQL.

Код, который я пробовал, не работает:

 Private Sub UpdateSetOpt()

    Dim db = New ACEDataContext
    Dim SRM = From q In db.Settings
              Where q.SettingID = frmMain.CurrentSID
              Select q.RollMethod

    Select Case SRM
        Case 1
            rbStandard.Checked = True
        Case 2
            rbProfession.Checked = True
        Case 3
            rbSpecies.Checked = True
        Case 4
            rbRandom.Checked = True
        Case Else
            rbStandard.Checked = False
            rbProfession.Checked = False
            rbSpecies.Checked = False
            rbRandom.Checked = False
    End Select

End Sub
  

Ответ №1:

SRM не является, Integer поскольку ваш From запрос возвращает коллекцию элементов. Чтобы получить только первое, используйте Single() :

 Dim SRM = (From q In db.Settings
           Where q.SettingID = frmMain.CurrentSID
           Select q.RollMethod).Single()
  

Если запрос фактически возвращает более одного значения, приведенный выше код завершится ошибкой; вам нужно использовать First вместо Single then. Оба завершатся неудачей, если запрос не вернет значение. В этом случае вместо этого может использоваться FirstOrDefault (но, вероятно, в вашей ситуации это неуместно).

Добавляя к этому, ваш Select Case является признаком запаха кода. Вам лучше создать массив всех флажков и использовать целое число для сопоставления с ним:

 Dim checks As CheckBox() = New CheckBox() { _
    rbStandard, rbProfession, rbSpecies, rbRandom }

' Unset all checkboxes:
For Each check In checks
    check.Checked = False
End For

If SRM > 0 AndAlso SRM <= checks.Length Then
    checks(SRM - 1).Checked = True
End If
  

Комментарии:

1. К вашему сведению, Single() будет работать до тех пор, пока возвращается только одна запись. Это вызовет исключение, если будет возвращено более одной записи. Если у вас есть шанс получить обратно более одной записи (и вы можете этого не сделать с помощью этого конкретного запроса), тогда вы можете использовать First() который похож Single() , но не заботится о том, есть ли более одной записи.

2. @Jim Из описания OP звучит так, как будто результат должен быть скалярным, поэтому Single было бы логичным выбором. Но вы правы, First стоит упомянуть.

3. Спасибо, ребята! Это было все. Сегодня на работе я думал, как запрос вернет список, а не int, и это было именно то, что мне было нужно.

4. Я заменил свой регистр select вашим кодом и строкой ‘check(SRM — 1). Checked = True’ выдает ошибку, в которой говорится, что проверка не объявлена

5. @Underonesky: Очевидно, должно быть checks , не check . Я исправил ответ.

Ответ №2:

SRM в вашем случае это не int, а IEnumerabe<int> .

Вам нужен первый элемент:

 SELECT CASE SRM.FirstOrDefault():