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
相关产品推荐
相关产品推荐

