我在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
感到困惑-不清楚它是做什么的。
我错过了什么?
2条答案
按热度按时间ejk8hzay1#
在此行中:
外部的
.Count()
方法需要一个lambda,它返回一个Boolean,其中的结果告诉.Count()
是否将该项作为最终结果的一部分。上述函数的结果是一个Integer,而不是布尔值。另外,你应该(可能)这样写:
在VB.Net中调用方法时省略括号仍然是法律的的,但这是为了与旧代码向后兼容,在其他情况下 * 不推荐 *。
我不知道VB代码在这里做什么,但是有一个正常的配置,也不能在VB中编译。你有什么不正常,特别是作为VB has some weird ideas about what Integer values can map to Boolean true and false.
ffscu2ro2#
这一点:
只能使用
Option Strict Off
编译。外部Count
调用需要返回Boolean
的委托,但内部Count
调用返回Integer
。这意味着必须将该Integer
隐式转换为Boolean
。您应该问的问题是如何修复VB以使用
Option Strict On
进行编译,要解决这个问题,你应该考虑代码实际上在做什么,实际上是一个0的计数会被转换成False
,其他的计数会被转换成True
。这意味着该代码实际上是在判断PublicSubType
列表中是否存在任何项。正确的方法是什么?使用Any
方法:请注意,
Distinct
调用是没有意义的,因为它可能会更改项目的数量,但不会更改是否存在项目。如何将其转换为C#but应该是非常明显的,所以我回答的是被问到的特定问题: