使用TryCast强制转换匿名类型LINQ不返回任何结果



我希望我的查询返回一个List (Of Service),然后我想使用新的列表来进一步过滤。

当我运行这个查询时,它执行正确

Dim duplicateService = svgGrpContainer.GroupBy(Function(x) x.ServiceGroup).Where(Function(x) x.Count > 1).Select(Function(x) x)

我现在试图转换它,以便使用它并创建另一个查询

    Dim duplicatePAK = duplicateServiceGroups.GroupBy(Function(x) x.Name).Where(Function(x) x.Count > 1).Select(Function(x) x)

当我强制转换第一个查询时,它现在返回Nothing

 Dim duplicateService As List(Of ServiceGroup) = TryCast(svgGrpContainer.GroupBy(Function(x) x.ServiceGroup).Where(Function(x) x.Count > 1).Select(Function(x) x), List(Of ServiceGroup))

ToList抛出一个分组异常I tried that.

如何转换查询以便在后续查询中进一步过滤数据?还是使用1个查询并按group和Name分组?

这是一个。net的解决方案(原谅c#)。

c#: https://dotnetfiddle.net/pUqNSSvb.net: https://dotnetfiddle.net/aixeIB

你需要使用一个匿名对象来按多个字段分组,然后使用SelectMany来使你的列表平坦化。

主旨是

    Dim duplicates As List(Of Thing) = 
        things.
            GroupBy(Function(thing) New With {Key .Name = thing.Name, Key .ServiceGroup = thing.ServiceGroup }).
            Where(Function(group) group.Count() > 1).
            SelectMany(Function(group) group.ToList).
            ToList()

执行LINQ操作后得到IEnumerable<T>。尝试使用.ToList()代替,但你有一个分组,你必须弄清楚需要在那里做什么-这取决于你的逻辑决定。

内部查询目前返回IGrouping(Of ServiceGroup, T)IEnumerable,这就是为什么它不会转换为IEnumerable(Of ServiceGroup)。不是选择整个IGrouping,而是选择每个组的Key。这应该会给你一个IEnumerable(Of ServiceGroup)

Dim duplicateService As List(Of ServiceGroup) = svgGrpContainer.
                                            GroupBy(Function(x) x.ServiceGroup).
                                            Where(Function(x) x.Count > 1).
                                            Select(Function(x) x.Key).
                                            ToList()

GroupBy方法不返回IEnumerable(of T),它返回IEnumerable(of IGrouping(of TKey, T))

在您的情况下,您从初始查询中得到的是IEnumerable(of IGrouping(of ServiceGroup, Service)),其中每个IGrouping本身是由ServiceGroup作为键分组的Service对象列表。

这里有几个选项,这取决于您的第二个查询(也分组)的目标。

一个选项是在第一个查询中使用SelectMany来"平坦"列表;这将使您回到IEnumerable(of Service),但在此过程中您将失去ServiceGroup的分组。这可能没问题:如果您只使用第一组来过滤Count,并且不再需要它,则此选项应该适用于您。我相信它会像这样简单(因为IGrouping实现了IEnumerable):

Dim duplicateService = svgGrpContainer.GroupBy(Function(x) x.ServiceGroup).Where(Function(x) x.Count > 1).SelectMany(Function(x) x)

如果你想要完成的是让你的服务由ServiceGroup分组,然后在每个服务组内由Name分组,我不确定如何在两个单独的查询中做到这一点。就我个人而言,我可能只是循环遍历我的第一个结果,然后一次一个地构建第二组,因为这比你想出的任何LINQ混乱都要清晰得多。如果你真的需要这个结果,请告诉我,我会看看我能想出什么办法。

最新更新