Dapper 用 Query<T>() 直接返回 List<T>,自动映射每行到 T 实例;列名与属性名大小写不敏感匹配,支持简单类型、元组及匿名类型;勿误用 QueryFirstOrDefault<List<T>>。

Dapper 查询数据库并返回 List<T> 非常直接,核心就是用 Query<T>() 方法,它默认就返回泛型列表。
使用 Query<T>() 直接获取 List<T>
Dapper 的 Query<T>() 方法执行查询后,会自动将每一行结果映射为类型 T 的实例,并装入 List<T> 返回。不需要手动转换或调用 ToList()(虽然加了也不报错)。
- 确保你的实体类(如
User)的属性名与 SQL 查询的列名(或别名)**大小写不敏感匹配**(Dapper 默认忽略大小写) - 列名和属性名完全一致最稳妥;若不一致,可用 SQL 别名对齐,例如:
SELECT Id AS UserId, Name AS UserName FROM Users - 支持匿名类型、自定义类、内置类型(如
Query<int>())
基础示例:查用户列表
using (var conn = new SqlConnection(connectionString))
{
var users = conn.Query<User>("SELECT * FROM Users WHERE Status = @status",
new { status = 1 });
// users 是 List<User> 类型,可直接遍历或返回
}注意:这里 users 的运行时类型就是 List<User>(准确说是 GridReader 内部构建的 List<T>),不是 IEnumerable<User> 延迟执行——Dapper 默认立即执行并缓存结果。
想返回 List<int>、List<string> 等简单类型?一样可以
只要 SQL 查询只返回单列,就能映射为简单类型的集合:
-
conn.Query<int>("SELECT Id FROM Users")→List<int> -
conn.Query<string>("SELECT Name FROM Users")→List<string> - 也支持元组:
conn.Query<(int Id, string Name)>("SELECT Id, Name FROM Users")
小提醒:别误用 QueryMultiple 或 QueryFirstOrDefault
如果你写了 QueryFirstOrDefault<List<User>>(),那是错的——这会让 Dapper 尝试把整张表“第一行”映射成一个 List<User> 对象,必然失败或为空。正确做法始终是 Query<User>()。
需要多结果集才用 QueryMultiple();要单个对象用 QueryFirstOrDefault<User>();要列表,就认准 Query<T>()。
基本上就这些。Dapper 返回 List 非常轻量自然,关键记住方法名和泛型参数对应你要的元素类型,不是集合类型。










