2013-09-04 3 views
1

У меня есть создать функцию:Далее не зацикливание в vb.net

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 действительно возвращает обе записи. Однако, когда я вступаю немного дальше, «Для каждого» не работает так, хотя appidQ возвращает 2 записи, функция возвращает только первую запись. Любая помощь будет принята с благодарностью.

UPDATE

Очевидно, что возврат 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 
+0

Какой тип данных APP_ID? –

+0

@Douglas Barbin в моей базе данных это tinyint, но Entity Framework вытаскивает его в виде байта. – aaronmallen

+1

Можете ли вы дать нам минимальный фрагмент кода о том, как вы используете результат функции? Это даст нам некоторый контекст. –

ответ

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 

EDIT

кажется из Вашего комментария, что вам нужно, это Строковое представление списка. И при попытке расширения 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 
+0

Это возвращает: System.Collections.Generic.List'1 [System.Int32], это должно return 1 и 2. Как я называю это также может быть проблемой: ViewData ("foo") = appid() – aaronmallen

+0

@aaronmallen, конечно, 'appid()' возвращает 'List ' ... содержащий 1 и 2 Вам нужно зациклиться на 'ViewData (" foo ")', чтобы получить ваши 1 и 2. –

+0

@aaronmallen Какой тип 'ViewData (" foo ")'? – Chris

0

Внутри цикла вы Return, поэтому выход из функции в целом (и петля, в частности).

Если вы не Return, вы не выйдете из функции, поэтому у вас будет возможность продолжить цикл.

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 
+0

Возвращает запрос, а не результат запроса. – aaronmallen

+0

@aaronmallen вы имеете в виду, что он возвращает IEnumerable или IQueryable, но не список int? Затем попытайтесь добавить ToList() –

+0

Итак, теперь он дает мне ошибку преобразования с INT32 в байты: LINQ to Entities не распознает метод Int32 ToInt32 (Byte) ', и этот метод не может быть переведен в выражение хранилища. – aaronmallen

0

Вы действительно должны иметь вариант . 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 

Было бы лучше, если бы он был строго типизирован, но это должно дать вам результат, который вы хотите.

EDIT: Если вам нужно преобразовать в 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 
Смежные вопросы