【问题标题】:Full outer join linq using union使用联合的完全外连接 linq
【发布时间】:2015-03-31 09:56:39
【问题描述】:

我有两个列表

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

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

【问题讨论】:

  • 您只是想根据 ID 和名称对数量值求和吗?如果是这样,听起来你想要一个群组加入。
  • 那么你想要 Max
  • 是否可以使用 union 得到结果?
  • 不,Union 根本不适合这种操作。
  • 请注意,不清楚为什么您认为您想要一个完整的外部连接 - 如果您真的想要,如果您可以在您的示例中说明这一点,将会很有用。根据我的回答,您已经获得的示例适用于内部连接。

标签: linq join comparator full-outer-join


【解决方案1】:

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

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

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

【讨论】:

  • 我需要外连接。不是内连接。
  • @decoder:您的示例没有显示如何您希望使用外连接 - 带有示例输入的内连接将为您提供所需的输出。如果您想要更好的答案,您应该在问题中提供更多详细信息。
【解决方案2】:

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

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 姓名:乙 数量1:84 数量2:52

您可以在这里修改和测试此代码 => link

【讨论】:

  • 好吧,现在很好。我修改了我的代码。我避免了这种情况。我使用外连接解决了。谢谢你的回答。
猜你喜欢
  • 2017-06-09
  • 2011-07-26
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 2014-09-23
相关资源
最近更新 更多