1

関数を作成しました:

Public Shared Function appid()
        Dim appidQ = From v In db_apps.app_users
                     Where v.NT_id = System.Environment.UserName
                     Select v
        For Each v In appidQ
            Return Convert.ToInt32(v.app_id)
        Next v
        Return appid()
    End Function

ユーザーのすべてのapp_idをビューデータに返そうとしています(テストのために、最終的にこの情報をCookieに配置します)。現在、基準を満たす2つのレコードがあるため、これは2つのレコードを返す必要がありますappidQ で指定されたクエリの。appidQ をデバッグすると、実際に両方のレコードが返されます。ただし、もう少し踏み込むと、「For Each」はループしないため、appidQ は 2 つのレコードを返しますが、関数は最初のレコードのみを返します。どんな助けでも大歓迎です。

アップデート

明らかに、ここで Return appid() がループを終了させるのは私の新しいコードです:

Public Shared Function appid()
    Dim appidQ = From v In db_apps.app_users
                 Where v.NT_id = System.Environment.UserName
                 Select v
    For Each v In appidQ
        Dim var = v.app_id
    Next v
    Return appid()
End Function

しかし、それはまだ私が必要とすることをしません。結果を返すために必要です

For Each v In appidQ
  Dim var = v.app_id
Next v
4

4 に答える 4

1

すでに気づいたreturnように、すべての結果を取得するには、ステートメントをループの後に移動する必要があります。

Public Shared Function appid() As List(Of Int32)
    Dim appidQ = From v In db_apps.app_users
                 Where v.NT_id = System.Environment.UserName
                 Select v
    Dim result As New List(Of Int32)
    For Each v In appidQ
        result.Add(Convert.ToInt32(v.app_id))
    Next v
    Return result
End Function

編集

あなたのコメントから、必要なのはリストの文字列表現であると思われます。拡張機能を試すとToString()、オブジェクトの名前が返されます (例:System.Collections.Generic.List1[System.Int32]より効率的な方法があるかどうかはわかりませんが、これは機能するはずです:

Public Shared Function appid() As String
    Dim appidQ = From v In db_apps.app_users
                 Where v.NT_id = System.Environment.UserName
                 Select v

    'Create a String representation
    Dim stringList As New System.Text.StringBuilder
    Dim counter As Integer = 0
    For Each v In appidQ
        stringList.Append(v.app_id.ToString())

        'Separator
        If Not counter = appidQ.Count - 1 Then
            stringList.Append("; ")
        End If
        counter += 1
    Next
    Return stringList.ToString
End Function
于 2013-09-04T16:20:33.727 に答える
1

Returnループ内にステートメントがあります。

Returnは関数レベルであるため、ループ (および関数) はループ内の最初の通過後に終了します。

あなたはそのようなことをするべきです(私はVBの男ではありません)。

Public Shared Function appid()
        Return (From v In db_apps.app_users
                     Where v.NT_id = System.Environment.UserName
                     Select v).ToList()
            .Select(Function(p)  Convert.ToInt32(p.app_id)).ToList()

    End Function

次に、ビューで、ViewData を使用している場合は、そのようなものです。

For Each id As Int32 In CType(ViewData("foo"), List(Of Int32)
...
Next
于 2013-09-04T16:14:31.487 に答える
0

ループ内で、あなたReturnは、関数を完全に終了します (特にループ)。

そうしないReturnと、関数を終了しないため、ループを続ける可能性があります。

于 2013-09-04T16:11:50.473 に答える