开发者

C# Linq Union On Attribute

I have two linq queries that I want to unionize on a common attribute:

One
{
     Id,
     Name,
     Color
}

Two
{
     Color,
     Cost
}

I want to get the union of O开发者_如何转开发ne and Two by unionizing on Color? If there is not a Two with a Color that corresponds to One, I want to set Cost to 0 in the output? How do I do this in LINQ?


Here is a sample using anonymous types on how to perform a left outer join:

var products = new[] {
  new { Id = 1, Name = "Alpha", Color = "Red" },
  new { Id = 2, Name = "Beta", Color = "Green" },
  new { Id = 3, Name = "Gamma", Color = "Blue" }
};
var costs = new[] {
  new { Color = "Red", Cost = 100 },
  new { Color = "Blue", Cost = 200 },
  new { Color = "Blue", Cost = 300 }
};
var query = products
  .GroupJoin(
    costs, p => p.Color, c => c.Color,
    (p, c) => new { p.Id, p.Name, p.Color, Costs = c.DefaultIfEmpty() }
  )
  .SelectMany(
    gj => gj.Costs,
    (gj, c) => new { gj.Id, gj.Name, gj.Color, Cost = c == null ? 0 : c.Cost }
  );

Query result:

Id Name  Color Cost
-------------------
1  Alpha Red   100
2  Beta  Green 0
3  Gamma Blue  200
3  Gamma Blue  300


This is called a join, not a union.
See the documentation.


You want a left outer join to keep the values appearing in the first list but are not present in the second.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜