2010-05-19 8 views
1
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"}, 
    }; 

quand j'utilise cette LINQ:se joindre à deux ensembles dans 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 
       }; 

je reçois cette valeur:

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

mais je voudrais avoir SET qui combine ces deux et le résultat serait:

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

Ce serait un jeu de résultats qui raconterait moi avec le nom NAME propriété qui l'a prise a été prise, si SSN a été trouvé dans SetA et SetB il aurait la propriété NAME = "setB"

quelqu'un pourrait-il m'aider avec cela?

+1

btw - J'espère que ce ne sont pas de vrais numéros SSN ... – Sunny

+2

@Sunny ce sont des numéros de sécurité sociale de l'avenir lorsque 10 chiffres seront nécessaires. – juharr

Répondre

4

Il vous semble voulez une jointure externe - cela se fait à l'aide GroupJoin:

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

La façon LINQ décrite ici: http://msdn.microsoft.com/en-us/library/bb397895.aspx ressemblerait à ceci (fonctionnellement identique à la façon lambda):

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)}; 
Questions connexes