C# WinForms项目中使用Dapper实现内连接查询数据的技术问询
没问题,这事儿我熟,咱们一步步来搞定这个内连接查询。首先得明确,咱们要把Authors和Book表通过关联字段(也就是AuthorId)把匹配的数据拉出来,Dapper处理这种联合查询非常顺手。
第一步:创建接收查询结果的DTO
因为查询结果是两个表字段的组合,咱们现有的Authors和Book实体类单独都没法装下所有结果,所以最好新建一个**DTO(数据传输对象)**来承接:
public class AuthorBookDto { public int AuthorId { get; set; } public string AuthorName { get; set; } public int BookId { get; set; } public string Title { get; set; } public string Description { get; set; } // 如果Book表还有其他需要返回的字段,直接加在这里就行 }
第二步:编写SQL内连接语句并通过Dapper执行
接下来就是写SQL和调用Dapper的查询方法了。假设你已经有了数据库连接字符串,直接套下面的代码就行:
using System.Data.SqlClient; using Dapper; // 替换成你自己的数据库连接字符串 string connectionString = "Server=你的服务器名;Database=你的库名;Trusted_Connection=True;"; // 内连接的SQL语句,用别名简化写法 string joinSql = @" SELECT a.AuthorId, a.AuthorName, b.BookId, b.Title, b.Description FROM Authors a INNER JOIN Book b ON a.AuthorId = b.AuthorId"; // 执行查询并映射到DTO列表 using (var dbConnection = new SqlConnection(connectionString)) { dbConnection.Open(); // Dapper会自动把查询结果映射到AuthorBookDto的属性上 var authorBookList = dbConnection.Query<AuthorBookDto>(joinSql).ToList(); // 这里就可以把结果用在WinForms里了,比如绑定到DataGridView // dataGridView1.DataSource = authorBookList; }
几个要注意的细节
- 字段类型匹配:我注意到你的
Book类里AuthorId是string类型,但Authors里是int,这大概率会导致查询时类型不匹配报错。建议要么把Book的AuthorId改成int(和数据库表字段保持一致),要么在SQL里做类型转换,比如ON a.AuthorId = CAST(b.AuthorId AS INT)——当然前者是更规范的做法。 - 属性名映射:如果DTO的属性名和数据库字段名不一样,你可以用SQL别名(比如
SELECT a.AuthorId AS WriterId ...),或者给DTO属性加[Column("字段名")]特性来告诉Dapper怎么映射。 - 连接管理:一定要用
using语句包裹数据库连接,这样能确保连接用完后自动释放,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Infii
相关产品推荐
相关产品推荐

