VB.Net Перебрать IQueriable (из ObjectA) и проверить, существует ли свойство в другой IQueriable (из ObjectB) - PullRequest
0 голосов
/ 15 октября 2019

У меня есть два IQueriable wsSelectedApps и allApps, которые мне нужны, чтобы просмотреть каждое приложение в allApps и проверить, существует ли свойство app.AppID в моем другом IQueriable.

Мой код до сих пор ....

        Dim wsSelectedApps = (From i In de.vw_AppsForWsList
                          Where i.WSID = WSID
                          Select i.ID, i.AppID)

        Dim allApps = (From a In de.TblApps
                       Select a.AppID, a.AppName)

        Dim appList As New List(Of DeploymentModel)

        For Each app In allApps
            'Loop through allApps and build up appList

            If xxxxxxxxxx Then
                'this app exists in wsSelectedApps
                appList.Add(New DeploymentModel With {
                    .AppID = app.AppID,
                    .AppName = app.AppName,
                    .ID = wsSelectedApps.ID,
                    .Selected = True })
            Else
                'this app does not exist in wsSelectedApps
                appList.Add(New DeploymentModel With {
                    .AppID = app.AppID,
                    .AppName = app.AppName,
                    .ID = 0,
                    .Selected = False})
            End If
        Next

Оператор IF изначально имел If wsSelectedApps.Contaings (app.AppID) Then ...

Это былохорошо, когда wsSelectedApps был просто списком AppID, но теперь он содержит два свойства. Как проверить, существует ли app.AppID в wsSelectedApps?

Ответы [ 3 ]

2 голосов
/ 15 октября 2019

Вы можете достичь этого, используя левое внешнее объединение в LINQ. Это похоже на SQL, но с LINQ вы можете указать значение по умолчанию, если совпадение не найдено. Я надеюсь, что это сработает для вас - я сделал столько, сколько смогу, с ограниченным знанием схемы вашей базы данных.

Dim appList =
    (From a In de.tblApps
     Group Join s In de.vw_AppsForWsList On a.AppID Equals s.AppID Into Group
     From p In Group.DefaultIfEmpty(New AppsForWsList With {.AppID = a.AppID, .AppName = a.AppName, .ID = 0})
     Select New DeploymentModel With {.AppID = p.AppID, .AppName = p.AppName, .ID = p.ID, .Selected = p.ID <> 0}).ToList()

См. этот ответ для получения дополнительной информации о vb.net LINQ left external join.

1 голос
/ 15 октября 2019

Вы можете использовать ярлык и создавать списки True, False непосредственно из исходных списков следующим образом:

Dim TrueList = (From a As DeploymentModel In de.TblApps, b As DeploymentModel In de.vw_AppsForWsList Where b.WSID = WSID AND  a.AppID = b.AppID Select a).ToList
Dim FalseList = de.TblApps.Except(TrueList).ToList

Если вам не нужно создавать новый список объекта DeploymentModel, вы можете изменять свойства объекта. Объекты DeploymentModel выглядят следующим образом:

TrueList.ForEach(Sub(a)
                    a.Selected = True
                    a.ID = ...
                    '...
                End Sub)

FalseList.ForEach(Sub(a)
                    a.Selected = False
                    a.ID = ...
                    '...
                End Sub)

И ниже результата быстрого теста:

True List:

Id: 2, AppId: 1002, AppName: Application 2, Selected: True
Id: 4, AppId: 1004, AppName: Application 4, Selected: True
Id: 6, AppId: 1006, AppName: Application 6, Selected: True
Id: 8, AppId: 1008, AppName: Application 8, Selected: True
Id: 10, AppId: 1010, AppName: Application 10, Selected: True

False List:

Id: 1, AppId: 1001, AppName: Application 1, Selected: False
Id: 3, AppId: 1003, AppName: Application 3, Selected: False
Id: 5, AppId: 1005, AppName: Application 5, Selected: False
Id: 7, AppId: 1007, AppName: Application 7, Selected: False
Id: 9, AppId: 1009, AppName: Application 9, Selected: False

Надеюсь, это поможет.

1 голос
/ 15 октября 2019

Вы можете использовать расширение Any(), предоставленное System.LINQ.
Ваше условие if будет выглядеть следующим образом

For Each app In allApps
    If wsSelectedApps.Any(Function(selected) selected.AppID = app.AppID) Then
        'Do something
    Else
        'Do something else
    End if
Next
...