对象中的 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 个实例。
我正在使用 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 个实例。