SelectMany不能演绎论点
本文关键字:演绎 不能 SelectMany | 更新日期: 2023-09-27 18:11:59
这是我的查询:
MyRepeater.DataSource = Objects
.GroupBy(p => p.FAC_ID)
.Select(p => p.First())
.First().Dipartimento.AreeDipartimento
.SelectMany(p => p.Aree);
但是它说不能用SelectMany
来推导参数。
相反,如果我这样做:
.SelectMany(p => p.Aree.AREA);
它工作!但是我需要Aree
(对象)的集合/列表,而不是Aree.AREA
(字符串)。
我错在哪里?
整个查询对我来说没有多大意义。你按FAC_ID
分组,然后你从每一组中取一个任意的第一个(没有顺序),从这些中取一个任意的对象。您可以实现同样的更有效和更清晰:
var obj = Objects.FirstOrDefault();
也许你想要这个代替(只是猜测):
MyRepeater.DataSource = Objects
.GroupBy(p => p.FAC_ID)
.Select(grp => grp.First()) // remove duplicates, keep an arbitrary
.SelectMany(p => p.Dipartimento.AreeDipartimento.Select(ad => ad.Aree));
这里SelectMany
从序列Dipartimento.AreeDipartimento
中选择Aree
对象,并将它们全部平展为一个序列,该序列用作中继器的DataSource
。
如果要连接多个序列,则应该使用.SelectMany
,因此参数必须是一个序列。如果不是这种情况,坚持使用.Select
方法。
更多信息,请看这里:Select和SelectMany的区别
我想你这里应该用Select
而不是SelectMany
。
SelectMany
用于在查询中处理的对象中选择集合。选择的集合然后在结果中连接在一起。
例如,如果你有这样的东西:
var a = {Tuple.Create("a", {1, 2, 3}),
Tuple.Create("b", {4, 5, 6}),
Tuple.Create("c", {7, 8, 9})}
您可以使用SelectMany
将Tuple
的Item2
中的所有结果值连接到一个列表中。a.SelectMany(t => t.Item2)
会导致
{1, 2, 3, 4, 5, 6, 7, 8, 9}
另一方面,Select仅用于标记一个结果(我假设这是您想要的)。所以a.Select(t => t.Item1)
会产生{"a", "b", "c"}
a.Select(t => t.Item2)
会产生:
{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
所以总的来说,我认为在你的例子中,像
MyRepeater.DataSource = Objects.GroupBy(p => p.FAC_ID).Select(p => p.First())
.First().Dipartimento.AreeDipartimento
.Select(p => p.Aree);
是正确的。这是我能给你的所有技巧,没有关于你的数据结构和预期结果的额外信息。