2011-04-15 49 views
3

在case語句中比較表中的Int條目的最佳方法是什麼?將Case語句與表中的Int條目一起使用

使用SQL Server 2008 R2,帶有LINQ to SQL的Visual Basic Express。

的代碼我試圖不工作:

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 

回答

2

SRM不是Integer,因爲你From查詢返回的項目的集合。爲了得到公正第一,使用Single()

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

如果查詢實際上返回多單值上面的代碼會失敗更多;那麼您需要使用First而不是Single。如果查詢返回值,則兩者都將失敗。在這種情況下,可以使用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

僅供參考,`單()`將工作,只要只返回一個記錄。如果返回多條記錄,它將引發異常。如果你有機會獲得多條記錄(你可能不需要這個特定的查詢),那麼你可以使用`First()`,就像`Single()`,但不在乎是否有多於一個記錄。 – Jim 2011-04-15 17:03:22

0

SRM你的情況是不是一個整數,但IEnumerabe<int>

你想要的元素:

SELECT CASE SRM.FirstOrDefault():