使用union的全外连接linq

时间:2015-02-01 08:57:11

标签: linq join comparator full-outer-join

我有两个列表

var left={[ID=1,Name='A',Qty1=0,Qty2=5],[ID=2,Name=B,Qty1=0,Qty2=52]};
var right={[ID=1,Name='A',Qty1=57,Qty2=0],[ID=2,Name=B,Qty1=84,Qty2=0]};
var outer=left.union(right);

我想得到以下结果:

outer={[ID=1,Name='A',Qty1=57,Qty2=5],[ID=2,Name=B,Qty1=84,Qty2=52]}

我该怎么做?如何编写比较器类?

修改: 我有两个清单

var target=(...new ClassA{ID=a.ID,Name=a.Name,TargetQty=b.TargetValue}).ToList();
var sales=(....new ClassA{ID=a.ID,Name=a.Name,SalesQty=b.SaleValue}).ToList();

现在我想要一个完整的外部联接。我怎么能得到它?

2 个答案:

答案 0 :(得分:2)

听起来你可能想要一个内部联接:

var query = left.Join(right, l => l.Id, r => r.Id,
                      (l, r) => new { l.Id, l.Name, r.Qty1, l.Qty2 });

(您可能想加入IdName;不清楚Id是否足够。)

答案 1 :(得分:1)

在这种情况下,union不会带来所需的输出。

Jon Skeet正确地指出内部联盟会做你想做的事。考虑到你的问题,似乎你需要内部联接与各行的总和,如下所示。如果不是您的要求,那么您需要修改您的问题。

    public class Program
{
    public static void Main()
    {
        var left= new List<Product>(){
            new Product(){ID=1,Name="A",Qty1=0,Qty2=5},
            new Product(){ID=2,Name="B",Qty1=0,Qty2=52}
        };
        var right= new List<Product>(){
            new Product(){ID=1,Name="A",Qty1=57,Qty2=0},
            new Product(){ID=2,Name="B",Qty1=84,Qty2=0}
        };

        var outer=left.Union(right);
        Console.WriteLine(outer.Count());//will be four which is not expected.

        var query = left.Join(right, d => d.ID, e=> e.ID, (f,g) => new Product(){ID = f.ID, Name = f.Name, Qty1 = f.Qty1+g.Qty1, Qty2 = f.Qty2+g.Qty2});

        foreach(var item in query)
        {
            item.Print();
        }
    }
}

public class Product {
    public int ID{get; set;}
    public string Name{get; set;}
    public int Qty1{get; set;}
    public int Qty2{get; set;}

    public void Print()
    {
        Console.WriteLine("ID  : {0}", ID);
        Console.WriteLine("Name: {0}", Name);
        Console.WriteLine("Qty1: {0}", Qty1);
        Console.WriteLine("Qty2: {0}", Qty2);
    }
}

以下是上述代码的输出:

  
    

4

         

ID:1     姓名:A     数量1:57     数量2:5

         

ID:2     姓名:B     数量1:84     数量2:52

  

您可以在此修改和测试此代码=&gt; link