如何将LINQ语句从VB转换为c#



我在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有一些奇怪的想法。

相关内容

  • 没有找到相关文章

最新更新