我需要知道如何将以下内容转换为 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 行