请求VB.NET中ReadObjects泛型方法的调用示例代码及说明
VB.NET ReadObjects泛型方法调用示例
先定义示例实体类
假设你有一个对应数据库表的实体类,比如Customer:
Public Class Customer Public Property Id As Integer Public Property Name As String Public Property Email As String End Class
调用方式1:使用Lambda表达式(匿名函数)
直接在调用时编写转换逻辑,适合简单场景:
' 编写查询SQL Dim sqlQuery As String = "SELECT Id, Name, Email FROM Customers" ' 调用ReadObjects,指定泛型类型为Customer,传入Lambda转换逻辑 Dim customers As IEnumerable(Of Customer) = ReadObjects(Of Customer)(sqlQuery, Function(reader) Return New Customer With { ' 通过GetOrdinal获取列索引,再读取对应类型的值 .Id = reader.GetInt32(reader.GetOrdinal("Id")), .Name = reader.GetString(reader.GetOrdinal("Name")), ' 处理可能的DBNull值,避免空引用异常 .Email = If(reader.IsDBNull(reader.GetOrdinal("Email")), Nothing, reader.GetString(reader.GetOrdinal("Email"))) } End Function) ' 遍历输出结果 For Each customer In customers Console.WriteLine($"ID: {customer.Id}, 姓名: {customer.Name}, 邮箱: {customer.Email}") Next
调用方式2:使用单独的转换方法
如果转换逻辑复杂或需要复用,可以定义单独的转换方法,通过AddressOf传入:
' 定义通用的转换方法,将IDataReader映射为Customer对象 Private Shared Function MapToCustomer(reader As IDataReader) As Customer Return New Customer With { .Id = reader.GetInt32(reader.GetOrdinal("Id")), .Name = reader.GetString(reader.GetOrdinal("Name")), .Email = If(reader.IsDBNull(reader.GetOrdinal("Email")), Nothing, reader.GetString(reader.GetOrdinal("Email"))) } End Function ' 调用ReadObjects,传入转换方法的引用 Dim sqlQuery As String = "SELECT Id, Name, Email FROM Customers" Dim customers As IEnumerable(Of Customer) = ReadObjects(Of Customer)(sqlQuery, AddressOf MapToCustomer)
关键注意点
- 必须明确指定泛型参数
Of T(比如Of Customer),让方法知道要返回的集合类型 - 读取列值时,
GetOrdinal("列名")比直接写索引数字更健壮,能避免数据库列顺序变化导致的错误 - 务必处理
DBNull情况(比如允许为空的列),否则会抛出类型转换异常
内容的提问来源于stack exchange,提问作者Bern Bilazon
相关产品推荐
相关产品推荐

