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