我希望我的查询返回一个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混乱都要清晰得多。如果你真的需要这个结果,请告诉我,我会看看我能想出什么办法。