Vb.net 使用TryCast强制转换匿名类型LINQ不会返回任何结果
我希望我的查询返回(服务)列表,然后我希望使用新列表进行进一步筛选 当我运行此查询时,它会正确执行Vb.net 使用TryCast强制转换匿名类型LINQ不会返回任何结果,vb.net,linq,Vb.net,Linq,我希望我的查询返回(服务)列表,然后我希望使用新列表进行进一步筛选 当我运行此查询时,它会正确执行 Dim duplicateService = svgGrpContainer.GroupBy(Function(x) x.ServiceGroup).Where(Function(x) x.Count > 1).Select(Function(x) x) 我现在正试图将其转换为使用它并创建另一个查询 Dim duplicatePAK = duplicateServiceGroups
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)
当我抛出第一个查询时,它现在什么也不返回
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查询并按组和名称分组?在执行LINQ操作后,您将得到一个
IEnumerable
。试着改用.ToList()
,但是你有一个分组,你必须弄清楚需要在那里做什么-这取决于你的逻辑决定。内部查询当前正在返回i分组(服务组的,T)
的IEnumerable
,这就是为什么它不会转换为IEnumerable(服务组的)
。不要选择整个i分组
,而是选择每个分组的键
。这将为您提供一个IEnumerable(服务组的)
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(关于IGrouping(关于ServiceGroup,Service))
,其中每个IGrouping
本身就是一个Service
对象列表,按ServiceGroup
键分组
根据第二个查询(也包括分组)的目标,这里有几个选项
一个选项是在第一个查询中使用SelectMany
,以“展平”列表;这将使您返回一个IEnumerable(of Service)
,但在此过程中,您将失去ServiceGroup
的分组。这可能没问题:如果您只使用第一组按计数进行筛选,并且不再需要它,那么此选项应该适用于您。我相信它会像这样简单(因为I分组
实现了IEnumerable
):
如果您试图完成的是将您的服务按ServiceGroup
分组,然后在每个服务组内按Name
分组,那么我不知道如何在两个单独的查询中进行分组。就我个人而言,我可能只是循环我的第一个结果,然后建立第二组,一次一组,因为这比你想到的任何LINQ混乱都要清楚得多。如果你真的需要这个结果,请告诉我,我会看看我能想出什么。这里有一个.net的工作解决方案(请原谅C#)
c#:
vb.net:
您需要使用匿名对象按多个字段分组,然后使用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()
我可以在一个查询中按组和名称分组吗?我相信他想要的是一个列表(服务)
。您可以选择x.ToList()
,但这将为您提供一个IEnumerable(of List(of Service))
并销毁分组。我只需要具有相同组和名称的组。你能在vb.net中显示这个吗?我有麻烦了converting@NickLaMarca当然,一秒钟后,我收到一个编译错误。.类型为'System.Collections.Generic.List(of System.Collections.Generic.List(of m02Auth.ServiceGroup))'的值不能转换为'System.Collections.Generic.List(of m02Auth.ServiceGroup)'嗯,可能是我的vb.net(我是c#guy)。让我也更新一下提琴,以确保它能正常工作。如果我保持匿名,它就能编译并正常工作。ThanksAll I want是一个具有相同组和名称的结果如何在svgGrpContainer
中说ServiceGroup
重复?例如,此Name
属性如果重复,则表示重复?
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()