1

私は次の機能を持っています:

Public Function CheckHasRoom(people_id As String, semester As String, year As String)
    ' Don't let folks already registered for a room register for another.
    Dim RoomSelected As String
    Using dbContext As pbu_housingEntities = New pbu_housingEntities
        Dim hasroom = (From p In dbContext.Residents _
                       Where p.people_code_id = people_id _
                       Where p.semester = semester _
                       Where p.year = year _
                       Where (p.room = "" _
                       Or p.building Is Nothing) _
                       Select p)
        If hasroom.Any() Then
            ' Let them keep going.
            RoomSelected = "N"
        Else
            ' Redirect them to the main page.
            RoomSelected = "Y"
            ' HttpContext.Current.Response.Redirect("default.aspx")
        End If
    End Using
    Return RoomSelected
End Function

しかし、hasroom.Any()で、「入力文字列が正しい形式ではありませんでした」と言ってバグアウトしています。理由について何か考えはありますか?これは、同じコードを他の場所で問題なく使用しているのと同じように、行のコレクションを返しますか?

4

3 に答える 3

2

使用してみてください.Count

   Dim hasroom = (From p In dbContext.Residents _
                   Where p.people_code_id = people_id _
                   AndAlso p.semester = semester _
                   AndAlso p.year = year _
                   AndAlso (p.room = "" _
                   Or p.building Is Nothing) _
                   Select p).count

'--------   Example   --------

Public Sub test()

    Dim l1 As New List(Of String) From {"1", "2", "3"}
    Dim l2 As New List(Of String) From {"1", "2", "3", "4", "5"}

    'return nothing 
    Dim noresult = From p In l1 Where 1 = 0 Select p

    'return ienumerable
    Dim someresult = From p In l1 Where p > 2 Select p

    'return ienumerable with count = 1 with handled_noresult(0)=Nothing
    Dim handled_noresult = (From p In l1 Where 1 = 0 Select p).DefaultIfEmpty

    'return emtpty array with .Length=0 --try this
    Dim handled_noresult2 = (From p In l1 Where 1 = 0 Select p).ToArray

    'return 1
    Dim FakeNoResult1 = handled_noresult.Count()

    'return 0
    Dim FakeNoResult2 = handled_noresult2.Count()

End Sub
于 2012-04-12T15:27:37.040 に答える
1

DaveMackay がコメントで示唆したように、where 句の 1 つがエラーを引き起こしているように見えます。コードの .Any() ポイントでエラーが発生する理由は、これがクエリが実際に実行される場所であるためです。それまでは、クエリの意図を宣言しましたが、実際にはまだ実行されていません。クエリを括弧で囲み、その末尾に .ToList() を追加すると、クエリが宣言されている行でエラーが発生する可能性があります。これにより、すぐに実行が強制されるためです。

あなたが得たエラーから、それは p.room = "" だと思います.p.roomは文字列値ですか? そうでない場合は、他のすべての句を確認してください。それらはすべて文字列ですか? 特にその年が文字列として保存される可能性は低いようです。

于 2012-04-13T08:28:01.020 に答える
0

クエリを試す

p.room = ''

それ以外の

p.room = ""
于 2012-04-13T04:05:03.000 に答える