tags:

views:

55

answers:

2
    var setsA = new List<SetA> {
        new SetA { SsnA = "3450734507", name = "setA"},
        new SetA { SsnA = "6833467788", name = "setA"},
        new SetA { SsnA = "5452347787", name = "setA"},
        new SetA { SsnA = "9345345345", name = "setA"},
    };

    var setsB = new List<SetB> {
        new SetB { SsnB = "5452347787" ,name = "setB"},
        new SetB { SsnB = "9345345345", name = "setB"},
    };

when i use this linq:

var Set =
                from seta in setsA
                join setb in setsB
                 on seta.SsnA
                    equals setb.SsnB
                select new { 
                    SSN = seta.SsnA,
                    NAME = setb.name
                };

i get this value:

{ SSN = "5452347787", NAME = "setB" }
{ SSN = "9345345345", NAME = "setB" }

but i would want to have SET which combines these two and the result would be:

{ SSN = "3450734507", NAME = "setA" }
{ SSN = "6833467788", NAME = "setA" }
{ SSN = "5452347787", NAME = "setB" }
{ SSN = "9345345345", NAME = "setB" }

This would be a result set that would tell me with the name NAME property which set it was taken from, if SSN was found in SetA and SetB it would have property NAME = "setB"

could someone help me with this?

+4  A: 

It seems you want an outer join - this is done using GroupJoin:

var set = setsA.GroupJoin(
    setsB,
    sa => sa.SsnA,
    sb => sb.SsnB,
    (a, bs) => new { SSN = a.SsnA, NAME = bs.Any() ? "setB" : "setA" });
Lee
A: 

The LINQ way described here: http://msdn.microsoft.com/en-us/library/bb397895.aspx would look like this (functionally same to the lambda way):

 var set = from a in setsA
           join b in setsB on a.SsnA equals b.SsnB into g
           from o in g.DefaultIfEmpty()
           select new { SSN = a.SsnA, NAME = (o != null ? o.name : a.name)};
code4life