Oleg Sh
Oleg Sh

Reputation: 9013

LINQ - many to many

I have 2 collections - invitedUserAllowedTimes and meeting.AllowedTimes. Collection invitedUserAllowedTimes has collection invitedUserAllowedTimes.Times.

Collection invitedUserAllowedTimes.Times has values TimeID = 1, TimeID = 2, TimeID = 3, TimeID = 4, TimeID = 5, TimeID = 6.

Collection meeting.AllowedTimes has values TimeID = 2, TimeID = 3, TimeID = 4.

I want to select from invitedUserAllowedTimes all records, which has all meeting.AllowedTimes TimeIDs. I try to do following:

var times = (
    from i in invitedUserAllowedTimes 
    where i.Times.All(p => meeting.AllowedTimes.Any(k=>k.TimeID == p.TimeID))
    select i).ToList();

but get no records. Why? What is incorrect in my code?

Upvotes: 1

Views: 57

Answers (2)

Corey Adler
Corey Adler

Reputation: 16137

It's not returning anything because you're asking it to return all invitedUserAllowedTimes where all of its times are in meeting.AllowedTimes. So your example won't return it because meeting.AllowedTimes doesn't have TimeID 1, 5, or 6.

Instead you need to do this:

var times = (
    from i in invitedUserAllowedTimes 
    where meeting.AllowedTimes.All(k=> i.Times.Contains(k.TimeID))
    select i).ToList();

Or, using extension methods:

var times = invitedUserAllowedTimes.Where(i => meeting.AllowedTimes.All(k => i.Times.Contains(k.TimeID)).ToList();

Upvotes: 1

aush
aush

Reputation: 2108

Try this:

var times = (from i in invitedUserAllowedTimes 
             where meeting.AllowedTimes.All(k => i.Times.Contains(k.TimeID))
             select i).ToList();

Upvotes: 1

Related Questions