Цикл по сложному типу Entity Framework - PullRequest
0 голосов
/ 26 апреля 2018

Попытка циклически просмотреть результаты хранимой процедуры с использованием структуры объекта. Мне нужно сравнить список сообществ со значением в текстовом поле, чтобы пользователь не вводил дубликаты сообществ в базу данных, используя флаг дублирования. Я могу получить свой список сообществ, но у меня возникают трудности при просмотре этого списка.

    Dim duplicate = False
    Dim list = Accommodations.GetCommunities
    For Each n As String In list.CommunityName
        If n = txtCommunities.Text Then
            duplicate = True
        End If
    Next n

Во время отладки я могу навести курсор на Accommodationings.GetCommunities и увидеть все значения, которые мне нужно перебрать в поле «CommunityName», но когда я перехожу через цикл, значение n отображается в виде одного символа. Есть ли способ превратить этот набор результатов в список, чтобы я мог просмотреть каждое значение в «CommunityName»

Я также попробовал приведенный ниже код, и он по какой-то причине устанавливает com, равный имени сложного типа, но он правильно перебирает правильное количество элементов в списке. Как извлечь это поле, чтобы сравнить его с текстовым полем?

    Dim duplicate = False
    Dim com As String = String.Empty
    Dim list = Accommodations.GetCommunities
    For i As Integer = 0 To list.count - 1
        com = list(i).ToString
        If com = txtCommunities.Text Then
            duplicate = True
        End If
    Next
    Return duplicate

ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:

Это функция, которую я использовал после. Использовал метод String.Compare () для сравнения строк и игнорирования регистра.

 Private Function checkDuplicates()
    Dim duplicate = False

    Dim list = Accommodations.GetCommunities 'Put items in a list
    For i As Integer = 0 To list.count - 1 'loop through the list
        If String.Compare(list(i).CommunityName, txtCommunities.Text, True) = 0 Then 'Compare the two strings, comparrison is not case sensitive
            duplicate = True 'set dup flag to true
            Exit For 'exit loop
        End If
    Next
    Return duplicate

End Function

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

В первом случае вы сравниваете n с каждым символом в CommunityName. Вы должны сделать что-то вроде:

For Each n As String In list
    If n.CommunityName = txtCommunities.Text Then

Во втором списке (i) это сообщество в списке. Таким образом, list (i) .ToString () показывает имя переменной.

0 голосов
/ 27 апреля 2018

Образец 1

Также возможно использование словаря, если у вас есть список словаря, вам не нужно циклически выполнять после того, как вы хотите добавить или удалить значение уникального ключа

Public Class TestClass
    Property Name As String
End Class
Private Function TestFun() As Boolean
    'Sample List to convert use Accommodations.GetCommunities
    Dim List As New List(Of TestClass)
    List.Add(New TestClass With {.Name = "a"})
    List.Add(New TestClass With {.Name = "b"})
    'If at Begining all elements by key are unique u can convert to dictionary
'
'From This Point u can map your list in to dictionary Use Accommodations.GetCommunities instant List. and type of what use in this collection replece as TestClass
    Dim CheckInDictionary As Dictionary(Of String, TestClass) = List.ToDictionary(Function(p) p.Name, Function(p) p)
    ' After you can us if some key or Id exist
    Return CheckInDictionary.ContainsKey("a")
End Function 'Return True

Образец 2

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

Метод list list Содержит проверку наличия элемента в указанном списке, поэтому перед добавлением нового элемента вы можете проверить, есть ли в списке. Для сравнения используется метод Equal, поэтому, если вы переопределяете его в базовом классе, вы можете применять специальные правила для равенства.

Как

Public Class TestClass
    Property Name As String
    Public Overrides Function Equals(obj As Object) As Boolean
        'IMPORTEND Input is as object if anny case will be somthing diffrent then this type it can meak exception
        If DirectCast(obj, TestClass).Name = Me.Name Then Return True
        Return MyBase.Equals(obj)
    End Function
End Class

и после того, когда вы попытаетесь добавить новый элемент в Dolike,

    Dim NewEle = New TestClass With {.Name = "a"}
    If Not List.Contains(NewEle) Then
        List.Add(NewEle)
    End If
0 голосов
/ 26 апреля 2018

Я думаю, что это должно выглядеть примерно так

Dim duplicate = False
Dim list = Accommodations.GetCommunities
For Each community As [something] In list
    If community.CommunityName = txtCommunities.Text Then
        duplicate = True
    End If
Next n

или

Dim duplicate = False
Dim list = Accommodations.GetCommunities
For i As Integer = 0 To list.count - 1
    If list(i).CommunityName = txtCommunities.Text Then
        duplicate = True
    End If
Next
Return duplicate

Примечание: попробуйте использовать правильные имена переменных вместо просто n. Кроме того, когда вы найдете дубликат, вы можете выйти из цикла или просто вернуть True сразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...