Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to implement left join in JOIN Extension method

I am trying to implement an outer join on this kind of query for the p.Person table. How would I do this?

This example is taken from http://ashishware.com/DSLinqExample.shtml

var onlyinfo = p.Person     .Where(n => n.FirstName.Contains('a'))     .Join(p.PersonInfo,         n => n.PersonId,         m => m.PersonId,         (n, m) => m)     .ToArray<Persons.PersonInfoRow>(); 
like image 936
Shantanu Gupta Avatar asked Sep 25 '10 07:09

Shantanu Gupta


1 Answers

Normally left joins in LINQ are modelled with group joins, sometimes in conjunction with DefaultIfEmpty and SelectMany:

var leftJoin = p.Person.Where(n => n.FirstName.Contains("a"))                        .GroupJoin(p.PersonInfo,                                    n => n.PersonId,                                   m => m.PersonId,                                   (n, ms) => new { n, ms = ms.DefaultIfEmpty() })                        .SelectMany(z => z.ms.Select(m => new { n = z.n, m })); 

That will give a sequence of pairs (n, m) where n is the entry from p.Person and m is the entry from p.PersonInfo, but m will be null if there are no matches.

(It's completely untested, btw - but should give you the idea anyway :)

like image 153
Jon Skeet Avatar answered Sep 25 '22 18:09

Jon Skeet