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

iqih9akk  于 2023-01-22  发布在  C#
关注(0)|答案(2)|浏览(150)

我在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感到困惑-不清楚它是做什么的。
我错过了什么?

ejk8hzay

ejk8hzay1#

在此行中:

Where g.Count(Function(x) x.PublicSubType.Distinct.Count) >= 100

外部的.Count()方法需要一个lambda,它返回一个Boolean,其中的结果告诉.Count()是否将该项作为最终结果的一部分。

Function(x) x.PublicSubType.Distinct.Count

上述函数的结果是一个Integer,而不是布尔值。另外,你应该(可能)这样写:

Function(x) x.PublicSubType.Distinct().Count()

在VB.Net中调用方法时省略括号仍然是法律的的,但这是为了与旧代码向后兼容,在其他情况下 * 不推荐 *。
我不知道VB代码在这里做什么,但是有一个正常的配置,也不能在VB中编译。你有什么不正常,特别是作为VB has some weird ideas about what Integer values can map to Boolean true and false.

ffscu2ro

ffscu2ro2#

这一点:

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#but应该是非常明显的,所以我回答的是被问到的特定问题:

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();

相关问题