joining two sets in LINQ

核能气质少年 提交于 2019-12-13 02:38:26

问题


    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?


回答1:


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" });



回答2:


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


来源:https://stackoverflow.com/questions/2867567/joining-two-sets-in-linq

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!