IEnumerables列表

时间:2013-12-08 18:42:41

标签: vb.net

请参阅以下代码,该代码由其他人撰写并且运作良好:

Public Function GetMembers(Optional ByVal sortExpression As String = "MemberId ASC") As List(Of Member) Implements IMemberDao.GetMembers
            Dim sql As String =
                " SELECT MemberId, Email, CompanyName, City, Country" &
                "   FROM [Member] ".OrderBy(sortExpression)

            Return db.Read(sql, Make).ToList()
        End Function

Public Iterator Function Read(Of T)(ByVal sql As String, ByVal make As Func(Of IDataReader, T), ParamArray ByVal parms() As Object) As IEnumerable(Of T)
            Using connection = CreateConnection()
                Using command = CreateCommand(sql, connection, parms)
                    Using reader = command.ExecuteReader()
                        Do While reader.Read()
                            Yield make(reader)
                        Loop
                    End Using
                End Using
            End Using
        End Function

Private Shared Make As Func(Of IDataReader, Member) =
            Function(reader) _
                New Member() With {
                    .MemberId = Extensions.AsId(reader("MemberId")),
                    .Email = Extensions.AsString(reader("Email")),
                    .CompanyName = Extensions.AsString(reader("CompanyName")),
                    .City = Extensions.AsString(reader("City")),
                    .Country = Extensions.AsString(reader("Country"))
                }

我理解Make是一个用值填充Member对象的委托,但是我不明白Read函数如何返回Persons列表? (列表返回并且运行良好)。

1 个答案:

答案 0 :(得分:2)

它由yield关键字执行此操作。这通常是在迭代集合时它的工作原理。看看这里:

http://msdn.microsoft.com/en-us/library/vstudio/hh156729.aspx

这应该给你一个好的/简单的理解。