Vishal
Vishal

Reputation: 6378

Combine two queries in linq

I have two linq queries as follows:

GroupNamesWithCorrespondingEffects 
        = new ObservableCollection<GroupNameWithCorrespondingEffect>(
                                  from g in db.Groups
                                  select new GroupNameWithCorrespondingEffect
                                                {
                                                    GroupID = g.GroupID,
                                                    GroupName = g.GroupName,
                                                    CorrespondingEffect = g.Master_Effects.Effect

                                                }
                                         );

 GroupNamesWithCorrespondingEffects 
          = new ObservableCollection<GroupNameWithCorrespondingEffect>       
                       (GroupNamesWithCorrespondingEffects.
                            Where(u => !GetAllChildren(25).
                                        Select(x => x.GroupID).
                                        Contains(u.GroupID)).ToList());

Now how can I combine these two queries?

Upvotes: 0

Views: 73

Answers (2)

Wasp
Wasp

Reputation: 3445

You can pass directly this to the constructor of the ObservableCollection:

from g in groups
let g = select new GroupNameWithCorrespondingEffect
        { 
            GroupID = g.GroupID,
            GroupName = g.GroupName,
            CorrespondingEffect = g.Master_Effects.Effect
        }
where !GetAllChildren(25)
       .Select(x => x.GroupID)
       .Contains(g.GroupID)
select g

I'm not sure if EF is able to compose the first and the second part (I can't remember from the top of my head if Contains is resolved in an IN clause, my EF is a bit rusty), but you were not doing that anyway, so the effect is the same as yours. If it is able to compose, then this way you are getting a more efficient execution.

Upvotes: 1

Neil T
Neil T

Reputation: 3285

If you don't mind mixing SQL-style and extension method syntax, you can do this:

GroupNamesWithCorrespondingEffects 
        = new ObservableCollection<GroupNameWithCorrespondingEffect>(
                (from g in groups
                 select new GroupNameWithCorrespondingEffect
                     { GroupID = g.GroupID,
                       GroupName = g.GroupName,
                       CorrespondingEffect = g.Master_Effects.Effect
                     })
                 .Where(u => !GetAllChildren(25)
                        .Select(x => x.GroupID)
                        .Contains(u.GroupID))
                 .ToList());

Upvotes: 0

Related Questions