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 并将其放在 viewdata 中(只是为了测试,我最终会将此信息放在 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

You've got a Return statement in your loop.

Return is at the function level, so your loop (and function) will be exited after first passage in the loop.

You should do somtething like that (I'm not a VB guy).

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

Then in your view, if you're using a ViewData, something like that.

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

在循环内部, you Return,所以你完全退出函数(尤其是循环)。

如果不这样做Return,您将不会退出该函数,因此您将有机会继续循环。

于 2013-09-04T16:11:50.473 回答
0

你真的应该有 Option Strict On。由于我们不知道 app_id 的数据类型是什么,并且您有 Option Strict Off,因此我们无法确定我们应该返回的确切内容。

尝试这个:

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

如果它是强类型的会更好,但这应该会给你你想要的结果。

编辑:如果您需要转换为 Int32,请尝试以下操作:

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
于 2013-09-04T16:47:59.797 回答