3

我已经尝试了阳光下的所有翻译服务来正确使用这种语法,但我仍然在 select 语句的第一部分(直到句号就在 groupby 关键字之前)

我试图在本地工作的在线示例中的原始 c# 语句:

public IEnumerable<TagGroup> GetTagGroups()
{

    var tagGroups = 
        // extract the delimited tags string and session id from all sessions
        DbSet.Select(s => new { s.Tags, s.Id })
            .ToArray() // we'll process them in memory.

            // split the "Tags" string into individual tags 
            // and flatten into {tag, id} pairs
            .SelectMany(
                s =>
                s.Tags.Split(_tagDelimiter, StringSplitOptions.RemoveEmptyEntries)
                    .Select(t => new { Tag = t, s.Id })
            )

            // group {tag, id} by tag into unique {tag, [session-id-array]}
            .GroupBy(g => g.Tag, data => data.Id)

            // project the group into TagGroup instances
            // ensuring that ids array in each array are unique
            .Select(tg => new TagGroup 
                            {
                                Tag = tg.Key, 
                                Ids = tg.Distinct().ToArray(),
                            })
            .OrderBy(tg => tg.Tag);

    return tagGroups;
}

我在VB中最接近它:

Public Function GetTagGroups() As IEnumerable(Of TagGroup)

    ' extract the delimited tags string and session id from all sessions
    ' we'll process them in memory.
    ' split the "Tags" string into individual tags 
    ' and flatten into {tag, id} pairs

    ' group {tag, id} by tag into unique {tag, [session-id-array]}

    ' project the group into TagGroup instances
    ' ensuring that ids array in each array are unique

    Dim tagGroups = DbSet.[Select](Function(s) New With { _
        s.Tags, _
        s.Id _
    }).ToArray().SelectMany(Function(s) s.Tags.Split(_tagDelimiter, StringSplitOptions.RemoveEmptyEntries).[Select](Function(t) New With { _
        Key .Tag = t, _
        s.Id _
    })).GroupBy(Function(g) g.Tag, Function(data) data.Id).[Select](Function(tg) New With { _
        Key .Tag = tg.Key, _
        Key .Ids = tg.Distinct().ToArray() _
    }).OrderBy(Function(tg) tg.Tag)

    Return tagGroups
End Function

这导致 Visual Studio 2012 intellisense 将语句的第一部分从第一行的“DbSet”到靠近底部的“.GroupBy”之前的最后一个括号用蓝色下划线。错误是“重载解析失败,因为无法使用这些参数调用可访问的 'SelectMany'”。

由于这是一个代码示例,我正在尝试转换为 vb 以在本地运行并理解并且我对 linq 的经验不足,我完全不知道如何尝试和处理这个问题。这超出了我目前的理解,所以就我所知,可能是一个简单的语法错误或从头到尾的完整哈希!

非常感谢任何指点。

4

1 回答 1

3

我现在把它放在 VS2k8 中,以及我之前提到的 VB 示例的两个简单问题:

  • 前两个New With结构必须指定.<field> =AFAIK,并且
  • 最后一个New With不应该是匿名的。

我现在还注意到这些是我需要让代码没有错误的声明。除了添加中间查询变量(顺便说一句,这意味着您可以将 C# 注释重新插入),我不记得实际上进一步更改了代码。请注意_tagDelimiteras a Char()-- C# 代码将其声明为什么?(看看String.Split提到StringSplitOptions它必须是的重载,Char()或者String()C# 隐式地改变了 VB.NET 没有的地方的类型。)

Class TagList
    Public Tags As String
    Public Id As String
End Class

Private DbSet As IQueryable(Of TagList)

Class TagGroup
    Public Tag As String
    Public Ids() As String
End Class

Private _tagDelimiter As Char()

Public Function GetTagGroups() As IEnumerable(Of TagGroup)

    Dim theTags = DbSet.[Select](Function(s) New With { _
        .Tags = s.Tags, _
        .Id = s.Id _
    }).ToArray()

    Dim many = theTags.SelectMany(Function(s) s.Tags.Split(_tagDelimiter, StringSplitOptions.RemoveEmptyEntries).[Select](Function(t) New With { _
        Key .Tag = t, _
        .Id = s.Id _
    }))

    Dim grouped = many.GroupBy(Function(g) g.Tag, Function(data) data.Id)

    Dim unordered = grouped.[Select](Function(tg) New TagGroup With { _
        .Tag = tg.Key, _
        .Ids = tg.Distinct().ToArray() _
    })
    Dim tagGroups = unordered.OrderBy(Function(tg) tg.Tag)

    Return tagGroups
End Function
于 2012-11-15T08:51:41.933 回答