You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:50:27