使用TryCast转换匿名类型LINQ返回Nothing

时间:2014-06-01 15:59:12

标签: vb.net linq

我希望我的查询返回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个查询并按组和名称分组?

4 个答案:

答案 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混乱更清晰。如果你真的需要这个结果,请告诉我,我会看到我能想到的结果。