我希望我的查询返回List(服务),然后我想使用新列表进一步过滤。
当我运行此查询时,它正确执行
Dim duplicateService = svgGrpContainer.GroupBy(Function(x) x.ServiceGroup).Where(Function(x) x.Count > 1).Select(Function(x) x)
我现在正试图将其投射到oder中以使用它并创建另一个查询
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会抛出我尝试过的分组异常。
如何转换查询以便我可以在后续查询中进一步过滤数据?或者使用1个查询并按组和名称分组?
答案 0 :(得分:3)
这是一个.net提供了一个有效的解决方案(原谅C#)。
c#:https://dotnetfiddle.net/pUqNSS vb.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()
答案 1 :(得分:0)
执行LINQ操作后得到IEnumerable<T>
。请尝试使用.ToList()
代替,但是您需要一个分组来确定需要在那里完成的工作 - 这取决于您的逻辑决定。
答案 2 :(得分:0)
内部查询目前返回IEnumerable
IGrouping(Of ServiceGroup, T)
,这就是为什么它不会被投放到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()
答案 3 :(得分:0)
GroupBy
方法不会返回IEnumerable(of T)
,而是返回IEnumerable(of IGrouping(of TKey, T))
在您的情况下,您从初始查询中获得的内容为IEnumerable(of IGrouping(of ServiceGroup, Service))
,其中每个IGrouping
本身就是由Service
分组的ServiceGroup
个对象的列表作为关键。
这里有几个选项,具体取决于您的第二个查询(也是分组)的目标。
一种选择是在第一个查询中使用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混乱更清晰。如果你真的需要这个结果,请告诉我,我会看到我能想到的结果。