I have a collection of Items that each have a collection of Relationships. I have a list of Groups that Items can have Relationships with.
I can find all the Items that have a particular relationship but I now want to find all the Items that don't have a Relationship with any of my Groups.
I can find the Items that have a relationship with any of the Groups by doing this:
Dim groupIds as List(of Integer) = (From g In cmdbGroups Select g.ID).ToList
Dim haveGroup = (From item In items _
Where item.Relationships.Any(Function(r) groupIds.Contains(r.TargetID)) _
Select item).ToList
How can I find all the items that do not have a relationship with any of the groups?
I don't remember VB all that well, but a simple "Not" should work.
Dim groupIds as List(of Integer) = (From g In cmdbGroups Select g.ID).ToList
Dim haveGroup = (From item In items _
Where Not item.Relationships.Any(Function(r) groupIds.Contains(r.TargetID)) _
Select item).ToList
Have you tried negating the results of the Contains
method?
Dim groupIds as List(of Integer) = (From g In cmdbGroups Select g.ID).ToList
Dim haveGroup = (From item In items _
Where item.Relationships.Any(Function(r) Not groupIds.Contains(r.TargetID)) _
Select item).ToList
If you're generating the haveGroup
collection anyway then you could just do something like this:
Dim groupIds as List(of Integer) = (From g In cmdbGroups Select g.ID).ToList
Dim haveGroup = (From item In items _
Where item.Relationships.Any(Function(r) groupIds.Contains(r.TargetID)) _
Select item).ToList
Dim haveNotGroup = items.Except(haveGroup).ToList
Dim notHasGroup = items.Except(haveGroup)
Dim listIds as List(of Integer) = (From g In cmdbGroups Select g.ID).ToList
Dim haveGroup = (From item In items _
Where Not listIds.Contains(item.ID)
Select item.ID).ToList