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

Azure上Raw SQL查询:如何将SELECT结果映射到自定义对象?

将SQL查询结果映射到自定义对象的解决方案

1. 定义自定义实体类

先创建与数据库[User]表结构匹配的实体类,属性名建议和表列名保持一致(同名映射更直观):

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string Email { get; set; }
    // 根据你的表结构,添加其他列对应的属性
}

2. 优化查询语句(推荐)

避免使用SELECT *,明确指定需要查询的列名,既提升性能,也能避免因表结构变更导致的映射错误:

string query = "SELECT Id, Username, Email FROM [User]";

3. 读取数据并映射到实体对象

把原代码中的List<string>替换为List<User>,在SqlDataReader的循环中逐个实例化User对象并赋值,同时处理数据库中可能存在的DBNull值:

SqlConnection connection = new SqlConnection(connectionString);

try
{
    connection.Open();

    string query = "SELECT Id, Username, Email FROM [User]";
    SqlCommand command = new SqlCommand(query, connection);

    List<User> userList = new List<User>();
    using (var reader = command.ExecuteReader())
    {
        // 获取列索引,避免硬编码下标,提升代码可维护性
        int idIndex = reader.GetOrdinal("Id");
        int usernameIndex = reader.GetOrdinal("Username");
        int emailIndex = reader.GetOrdinal("Email");

        while (reader.Read())
        {
            User user = new User();
            // 处理DBNull,避免抛出类型转换异常
            user.Id = reader.IsDBNull(idIndex) ? 0 : reader.GetInt32(idIndex);
            user.Username = reader.IsDBNull(usernameIndex) ? null : reader.GetString(usernameIndex);
            user.Email = reader.IsDBNull(emailIndex) ? null : reader.GetString(emailIndex);

            userList.Add(user);
        }
    }

    // 示例:遍历输出映射后的对象
    foreach(var user in userList)
    {
        Console.WriteLine($"Id: {user.Id}, Username: {user.Username}, Email: {user.Email}");
    }

    Console.WriteLine("Row retrieved successfully.");
}
catch (Exception ex)
{
    // 建议添加异常捕获逻辑
    Console.WriteLine($"Error: {ex.Message}");
}
finally
{
    // 确保数据库连接关闭
    if (connection.State == ConnectionState.Open)
    {
        connection.Close();
    }
}

额外提示

  • 你原代码中的var x = command.ExecuteNonQuery();属于冗余代码,ExecuteNonQuery主要用于执行增删改语句,对SELECT语句返回-1,且在ExecuteReader后执行会重复触发查询,建议删除。
  • 若表中存在其他数据类型(如DateTime、bool),对应使用reader.GetDateTime()、reader.GetBoolean()等方法即可,同样要注意处理DBNull。
  • 若想简化映射逻辑,也可以使用ORM框架(如Dapper、Entity Framework Core),但原生手动映射更轻量,适合简单业务场景。

内容的提问来源于stack exchange,提问作者inno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:24:52