答案:C#中常用数据库查询结果映射方式有五种。1. ADO.NET手动映射,性能高但代码重复;2. Entity Framework/EF Core,支持LINQ与自动映射,适合大型项目;3. Dapper微型ORM,性能接近原生且语法简洁;4. AutoMapper配合数据读取器,统一DTO映射规则;5. 自定义泛型工具通过反射实现通用映射,灵活但需处理性能与异常。选择依据项目规模、性能需求与开发效率权衡。

在C#中,将数据库查询结果映射到对象是数据访问中的常见需求。实现方式有多种,每种适用于不同的场景和开发偏好。以下是几种主流方法:
优点:完全控制,性能高;缺点:代码重复多,易出错。
示例:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
<p>using (var connection = new SqlConnection(connectionString))
{
connection.Open();
using (var command = new SqlCommand("SELECT Id, Name, Email FROM Users", connection))
using (var reader = command.ExecuteReader())
{
var users = new List<User>();
while (reader.Read())
{
users.Add(new User
{
Id = reader.GetInt32("Id"),
Name = reader.GetString("Name"),
Email = reader.GetString("Email")
});
}
return users;
}
}
只需定义类与数据库表的对应关系(可通过数据注解或 Fluent API),EF 会自动生成 SQL 并完成映射。
示例:
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
}
<p>// 查询自动映射
using (var context = new AppDbContext())
{
var users = context.Users.Where(u => u.Name.Contains("John")).ToList();
}
支持 LINQ 查询,类型安全,开发效率高。适合中大型项目。
它在性能上接近原生 ADO.NET,同时大幅简化映射代码。
示例:
using (var connection = new SqlConnection(connectionString))
{
var users = connection.Query<User>("SELECT * FROM Users WHERE Age > @Age", new { Age = 18 });
return users.ToList();
}
Dapper 支持复杂类型映射、多结果集、存储过程等,广泛用于高性能场景。
通常需要配合自定义映射逻辑或第三方扩展(如 AutoMapper.Data)使用。
示例思路:
using (var reader = command.ExecuteReader())
{
var config = new MapperConfiguration(cfg => cfg.CreateMap<IDataReader, User>());
var mapper = config.CreateMapper();
var users = mapper.Map<IEnumerable<User>>(reader);
}
适合已有大量 DTO 的项目,统一映射规则。
例如创建一个 DataReaderMapper 类:
public static List<T> Map<T>(IDataReader reader) where T : new()
{
var list = new List<T>();
var type = typeof(T);
var properties = type.GetProperties().Where(p => p.CanWrite);
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">while (reader.Read())
{
var obj = new T();
foreach (var prop in properties)
{
if (!reader.IsDBNull(prop.Name))
{
var value = reader[prop.Name];
prop.SetValue(obj, Convert.ChangeType(value, prop.PropertyType));
}
}
list.Add(obj);
}
return list;}
灵活但需注意性能和异常处理。
基本上就这些常用方式。选择哪种取决于项目规模、性能要求和开发效率权衡。小型项目可用 Dapper,大型系统推荐 EF Core,极致性能可手写 ADO.NET。
以上就是C#中如何实现数据库查询的结果映射到对象?方法有哪些?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号