【发布时间】:2015-11-19 23:21:54
【问题描述】:
List<dynamic> a = new List<dynamic>();
a.Add(new { Foo = 1, Baz = "Inga", Name = "Alice"});
a.Add(new { Foo = 2, Baz = "Baz", Name = "Bob"});
a.Add(new { Foo = 3, Baz = "Hi", Name = "Charlie"});
List<dynamic> b = new List<dynamic>();
b.Add(new { Foo = 1, Value = "Bar", Code = "A"});
b.Add(new { Foo = 1, Value = "Quux", Code = "B"});
b.Add(new { Foo = 2, Value = "Bar", Code = "C"});
b.Add(new { Foo = 3, Value = "Mint", Code = "A"});
b.Add(new { Foo = 3, Value = "Seven", Code = "Q"});
b.Add(new { Foo = 3, Value = "Threeve", Code = "T"});
好的....所以我有一个问题(自然) 这是人为设计和简化的,以专注于手头的问题。 我需要修改一个 Linq 查询以将两个列表投影到以下响应:
[
{ Foo = 1
, Baz = "Inga"
, Code = "A"
, Bars = [{ Value = "Bar", Code = "A"}
,{ Value = "Quux", Code = "B"}
]
}
,{ Foo = 2
, Baz = "Baz"
, Code = "C"
, Bars = [{ Value = "Fizz", Code = "C"}]
}
,{ Foo = 3
, Baz = "Hi"
, Code = "A"
, Bars = [{ Value = "Mint", Code = "A"}
,{ Value = "Seven", Code = "Q"}
,{ Value = "Threeve", Code = "T"}
]
}
]
首先,TL;DR
有没有办法查询集合b来选择
(b.First Where Distinct By b.Foo) AsEnumerable()?
...长版
我需要选择a 的投影,但是当它被具体化时,在b 列表中识别第一个Code,其中b.Foo == a.Foo 并将b.Code 直接放在a 上。然后 b 中 b.Foo == a.Foo 的项目需要放入 a.Bars 中。
我手头的问题是我没有识别单个 a,所以我无法预先选择 a 和 b 值来简化这个混乱,也没有机会改造。
所以,如果我想搜索Where Value = Bar; Alice 和 Bob 需要返回正确的映射和投影。
天真的尝试是......
var results = a.Join( b
, master => master.Foo
, detail => detail.Foo
, (master, detail) => new { master, detail})
.Select(item => new
{
item.master.Foo
, item.master.Baz
, item.master.Name
, item.detail.Code
, Bars = b.Select(x => x.Foo.Equals(item.master.Foo))
};
但这会导致我的结果包含重复的“Alice”记录和重复的“Charlie”记录,因为它内部连接了 a 和 b。我真正想做的(伪)是
a.Join(
b.Where(b.Foo.Equals(a.Foo)).First()
, master => master.Foo
, detail => detail.Foo
, (master, detail) => new { master, detail}
)
.Select(item => new
{
item.master.Foo
, item.master.Baz
, item.master.Name
, item.detail.Code
, Bars = b.Select(x => x.Foo.Equals(item.master.Foo))
};
但无论我怎么尝试,结果都是一团糟。
...注意,我不能采取幼稚的方法然后运行
DistinctBy,因为投影是匿名的。
任何人都可以通过 Linq to Object 查询来解决这个问题吗? (注意:我不需要单通道分辨率)
【问题讨论】:
标签: c# linq linq-to-objects