我在VB中有以下LINQ语句:
Dim query As List(Of RepresentativeCase)
query = (From w In Me.RepresentativeCases
Where w.Active = True
Group w By w.PublicSubType, w.LawArea Into g = Group
Where g.Count(Function(x) x.PublicSubType.Distinct.Count) >= 100
Select g.First()
).ToList()
我正试图转换成c#和有麻烦。我得到了以下内容,但它无法编译:
List<RepresentativeCase> query = (
from w in this.RepresentativeCases
where w.Active == true
group w by new { w.PublicSubType, w.LawArea} into g
let PublicSubType = g.Key.PublicSubType
let LawArea = g.Key.LawArea
where g.Count(x => x.PublicSubType.Distinct().Count()) > 100 // breaks here
select g.First()).ToList();
where g.Count(x => x.PublicSubType.Distinct().Count()) > 100
行不能编译。此外,我对VB示例中的Into g = Group
感到困惑-不清楚它是做什么的。
我错过了什么?
This:
Where g.Count(Function(x) x.PublicSubType.Distinct.Count) >= 100
只能用Option Strict Off
编译。外部Count
调用需要一个返回Boolean
的委托,但是内部Count
调用返回一个Integer
。这意味着Integer
必须隐式地转换为Boolean
。
你应该问的问题是如何修复VB与Option Strict On
编译,要解决这个问题,你应该考虑代码实际在做什么。实际发生的情况是,0计数将被转换为False
,而任何其他计数将被转换为True
。这意味着代码实际上在做的是确定PublicSubType
列表中是否有任何项。正确的做法是什么?使用Any
方法:
Where g.Count(Function(x) x.PublicSubType.Any()) >= 100
请注意,Distinct
调用是没有意义的,因为它可能会改变项目的数量,但不会改变是否有任何项目。
如何将其转换为c#应该是很明显的,但是,因此我回答了所问的特定问题:
List<RepresentativeCase> query = (
from w in this.RepresentativeCases
where w.Active == true
group w by new { w.PublicSubType, w.LawArea} into g
let PublicSubType = g.Key.PublicSubType
let LawArea = g.Key.LawArea
where g.Count(x => x.PublicSubType.Any()) > 100
select g.First()).ToList();
这一行:
Where g.Count(Function(x) x.PublicSubType.Distinct.Count) >= 100
外部.Count()
方法期望一个lambda返回一个布尔值,这里的结果告诉.Count()
是否将该项作为最终结果的一部分。但是你有这个:
Function(x) x.PublicSubType.Distinct.Count
上面函数的结果是一个Integer,不是布尔值。此外,您应该(可能)这样写:
Function(x) x.PublicSubType.Distinct().Count()
在VB中调用方法时省略括号仍然是合法的。但这是为了向后兼容旧代码,在其他情况下不建议使用。
我不确定VB代码在这里做什么,但是用一个相同的配置,也不会在VB中编译。你得到的是而不是特别是VB对于哪些整型值可以映射为布尔值true和false有一些奇怪的想法。