对象中的 dapper 对象是否有某种方法可以加载到 sfdatagrid 中?

Is there some way with dapper object in object to load in sfdatagrid?

我正在使用 Dapper,当我执行查询并加载到 SfDataGrid 时,只显示第一个 table.

的结果

型号:

public class Users
{
    public int id { get; set; }
    public string name { get; set; }
    public string email { get; set; }
    public Roles role { get; set; }
}

public class Roles
{
    public int id { get; set; }
    public string name { get; set; }
}

所以当我喜欢的时候

sfDataGrid1.DataSource = results; 

它只显示用户 ID、名称、电子邮件,没有角色名称。

查询:

select a.*, b.name from users a inner join roles b on users.roleID = roles.id.

Tables users: id, name, email, roleID.

Table roles: id, name.

编辑:

public List<Users> GetUsers() { 
    using (IDbConnection connection = new MySql.Data.MySqlClient.MySqlConnection(Helper.CnnVal("db2021"))) { var sql = @"SELECT A.*, B.* FROM users A INNER JOIN Roles B on B.id = A.roleID"; 
    var result = connection.Query<Users>(sql, (a, b) => { a.role = b; return a; }).ToList(); return result; } 
    }

List<Users> users = new List<Users>(); 
users = GetUsers(); 
sfDataGrid1.DataSource = users;

假设你有一个class这样的角色

public class Roles
{
    public int id {get;set;}
    public string name {get;set;}

}

那么您的查询应该是

public List<Users> GetUsers() { 
    using (IDbConnection connection = new MySql.Data.MySqlClient.MySqlConnection(Helper.CnnVal("db2021"))) { 
        var sql = @"SELECT A.*, B.* FROM users A INNER JOIN Roles B on B.id = A.roleID"; 
        var result = connection.Query<Users,Roles,Users>(sql, (a, b) => 
        { 
             a.role = b; 
             return a; 
        }).ToList(); 
        return result; 
   } 
}


List<Users> users = GetUsers(); 
sfDataGrid1.DataSource = users;

换句话说,你需要告诉 Dapper 代表 B.* 数据的 class 是什么,lambda 中的 return 值是什么。

如果您想要一个同时包含用户和角色名称数据的 class,那么您需要将这个特定的 class 定义为

public class UsersViewModel
{
    public int id { get; set; }
    public string name { get; set; }
    public string email { get; set; }
    public int roleid {get;set;}
    public string rolename {get;set;}
}

并且查询应该更改为以这种方式检索数据

public List<Users> GetUsers() 
{ 
    using (IDbConnection connection = new MySql.Data.MySqlClient.MySqlConnection(....))
    { 
        var sql = @"SELECT A.*, B.name as rolename 
                    FROM users A INNER JOIN Roles B 
                                 ON B.id = A.roleID"; 
        var result = connection.Query<UsersViewModel>(sql).ToList(); 
        return result; 
   } 
}

请注意,这不再是与数据库字段的一对一映射,因此我们有一种 class 的 ViewModel,并且我们适当地命名它以避免混淆。

同样对于 dapper,查询提取的属性和列具有相同的名称也很重要;因此角色 table 中的 name 列在查询中显示为 rolename。这将允许 dapper 从查询的结果集中构建 UserViewModel class 个实例。