如何将这个C# lambda表达式转换为VB.Net?

3

我尝试将一个我已经使用多次的C# lambda表达式转换为VB.Net,但是我似乎无法弄清楚要使用的正确语法。以下是原始的C#代码:

public override IQueryable<E> Select<E>(params System.Linq.Expressions.Expression<Func<E, object>>[] includeExpressions)
{
    IQueryable<E> result = null;

    if (includeExpressions.Any())
    {
        result = includeExpressions.Aggregate<Expression<Func<E, object>>, IQueryable<E>>(Context.Set<E>(), (current, expression) => current.Include(expression));
    }

    return result;
}

我尝试过使用在线代码转换器,也试着自己重写该函数,但是我一无所获。当我提供以前的方法时,这就是代码转换器输出的内容:

Public Overrides Function [Select](Of E As Class)(ParamArray includeExpressions As Expression(Of Func(Of E, Object))()) As IQueryable(Of E)
    Dim result As IQueryable(Of E) = Nothing

    If includeExpressions.Any() Then
        result = includeExpressions.Aggregate(Of Expression(Of Func(Of E, Object)), IQueryable(Of E))(Context.[Set](Of E)(), Function(current, expression) current.Include(expression))
    End If

    Return result
End Function

我认为罪魁祸首是以下内容:

Function(current, expression) current.Include(expression)

我认为代码转换器(包括我手动尝试)没有正确格式化这个 lambda 表达式。

以下是一篇博客文章的链接,它描述了使用方法和目的,如果您需要更多细节: http://www.viamacchina.com/2014/01/generic-repositories-including-includes.html

该函数无法在 VB.Net 中编译。我收到一个错误,指出 includeExpressions.Aggregate 调用没有正确数量的参数。我认为这是由于第二个参数(lambda)没有正确编译和返回其结果所致。


4
Lambda表达式的翻译我认为挺不错的。这段代码能编译通过吗?如果不能,出现了什么错误? - Thomas Levesque
1个回答

1

如果你关闭Strict,我认为它应该可以工作,编译器可能不喜欢lambda的返回类型。如果你想保持Strict,那么按照这种方式做也应该可以工作:

Public Function [Select](Of E As Class)(ParamArray includeExpressions As Linq.Expressions.Expression(Of Func(Of E, Object))()) As IQueryable(Of E)
        Dim result As IQueryable(Of E) = Nothing

        If includeExpressions.Any() Then
            result = includeExpressions.Aggregate(Context.[Set](Of E)(), (Function(current, expression) CType(current.Include(expression), DbSet(Of E))))
        End If

        Return result
    End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接