0

我需要知道如何将以下内容转换为 VB.net 以用于 Async/Await 项目:

public static class Extensions {

    public static IEnumerable<T> Select<T>(
        this SqlDataReader reader, Func<SqlDataReader, T> projection) {

        while (reader.Read()) {
            yield return projection(reader);
        }
    }
}

用法:

'call the database asynchronously... and 'await' the results
Using reader = Await Db.GetReaderAsync("spGetDashboard", ParamList)
    Return reader.Select(Function(r)
                             Return New DashboardInfo With {.RowNum = CType(r.Item("RowNum"), Long?)}
                         End Function)

这是我到目前为止所拥有的:

<Extension()>
Public Function [Select](Of T)(reader As SqlDataReader, projection As Func(Of SqlDataReader, T)) As IEnumerable(Of T)
    While reader.Read()
        Return CType(projection(reader), IEnumerable(Of T))
    End While
End Function

这是一个例外:

System.InvalidCastException:无法将“WindowsApplication1.DashboardInfo”类型的对象转换为“System.Collections.Generic.IEnumerable`1[WindowsApplication1.DashboardInfo]”类型。在 C:\Dev\AsyncDbTesting\AsyncDbTesting\Library\Extensions.vb 中的 WindowsApplication1.Extensions.Select[T](SqlDataReader 阅读器,Func`2 投影):第 523 行
在 C:\Dev\AsyncDbTesting\AsyncDbTesting\Process.vb:line 30 中的 WindowsApplication1.Process.VB$StateMachine_1_GetDashboardAsync.MoveNext() --- 在 System.Runtime 中从先前抛出异常的位置结束堆栈跟踪。 CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at WindowsApplication1.Form1.VB$StateMachine_0_Button1_Click.MoveNext() in C:\Dev\AsyncDbTesting\AsyncDbTesting\Form1.vb: 第 17 行

4

1 回答 1

0

抛出异常是因为您试图将 type 的项目转换T为 type IEnumerable(Of T)

假设您使用的是 .Net framework 4.5,您想要的代码是

<Extension()>
Public Iterator Function [Select](Of T)(reader As SqlDataReader, projection As Func(Of SqlDataReader, T)) As IEnumerable(Of T)
    While reader.Read()
        Yield projection(reader)
    End While
End Function

请注意,Yield在 .Net 框架 4.5 之前的 VB.NET 中不存在迭代器的概念。

于 2012-12-10T21:29:36.040 回答