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(字符串)。

我错在哪里?

SelectMany不能演绎论点

整个查询对我来说没有多大意义。你按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})}

您可以使用SelectManyTupleItem2中的所有结果值连接到一个列表中。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);

是正确的。这是我能给你的所有技巧,没有关于你的数据结构和预期结果的额外信息。