使用 Dapper 填充 class 个对象
Fill class object using Dapper
public class Expenses
{
public Category Category { get; set; }
public PaymentModes PaymentModes { get; set; }
}
public class Category
{
public int CategoryID { get; set; }
public string CategoryName { get; set; }
}
public class PaymentModes
{
public int PaymentModeID { get; set; }
public string PaymentMode { get; set; }
}
public class ViewModel
{
public IEnumerable<Month> Month { get; set; }
public IEnumerable<Category> Category { get; set; }
public IEnumerable<Expenses> Expenses { get; set; }
}
所以我有这些 classes。现在我想使用 Dapper 填充 Expense class 对象。
但我总是将 Category 和 PaymentModes 设置为 null。这是我从 DB 获得的结果:
获取费用数据的方法如下:
public ViewModel FetchSummaryData(Expenses expenses)
{
DynamicParameters param = new DynamicParameters();
ViewModel viewModel = new ViewModel();
param.Add("@flag", expenses.flag);
var result = db.QueryMultiple("sp_Summary", param, commandType: CommandType.StoredProcedure);
if (result != null)
{
viewModel.Category = result.Read<Category>();
viewModel.Expenses = result.Read<Expenses>();
}
return viewModel;
}
如您所见,该特定 ExpenseID 的类别和付款模式始终为空。如何使用 Dapper 填充这些对象的属性?
谢谢。
我想您有一个 Expenses table 与 PaymentModes 和 Category table 有关系 1:1。在这种情况下,您的 sp 应该 return 来自 Expenses table 的所有记录,首先列出 Expenses 字段,然后是 PaymentModes 字段,最后是 Category 字段。像这样
select e.*, p.PaymentModeId, p.PaymentMode, c.CategoryID, c.CategoryName
from tbl_Expenses e inner join PaymentModes p on e.PaymentModeID = p.PaymentModeID
inner join Category c on e.CategoryID = c.CategoryID
where ......
如果您与 PaymentModes 和类别 table 没有关系,但所有内容都存储在单个费用 table 中,那么您不需要连接,只需在正确的顺序让 Dapper 知道如何使用你的字段来填充所需的对象
select ExpenseID, Price, ExpenseDate, .....,
PaymentModeID, PaymentMode,
CategoryID, CategoryName
from tbl_Expenses
where ....
无论如何你运行你的查询
var result = db.Query<Expenses, PaymentModes, Category, Expenses>("sp_Summary",
(e,p,c) =>
{
e.PaymentModes = p;
e.Category = c;
return e;
}, splitOn: "PaymentModeID,CategoryID", param: param, commandType: CommandType.StoredProcedure);
此时结果变量是 IEnumerable<Expense>
,具有正确的 PaymentModes 和 Category 集。
splitOn 参数允许 Dapper 知道在调用 Query 方法所需的三个对象中应该在哪个字段上分隔结果数据。
因此,将 PaymentModeID 之前的所有字段分配给 Expenses 变量,然后将 CategoryID 之前的字段分配给 PaymentModes 变量,最后分配给 Category 变量的字段传递给 lambda 表达式。
在 lambda 内部,您只需将 p 和 c 变量分配给 Expenses 变量的适当字段并满足 Func 签名 return 支出变量
public class Expenses
{
public Category Category { get; set; }
public PaymentModes PaymentModes { get; set; }
}
public class Category
{
public int CategoryID { get; set; }
public string CategoryName { get; set; }
}
public class PaymentModes
{
public int PaymentModeID { get; set; }
public string PaymentMode { get; set; }
}
public class ViewModel
{
public IEnumerable<Month> Month { get; set; }
public IEnumerable<Category> Category { get; set; }
public IEnumerable<Expenses> Expenses { get; set; }
}
所以我有这些 classes。现在我想使用 Dapper 填充 Expense class 对象。 但我总是将 Category 和 PaymentModes 设置为 null。这是我从 DB 获得的结果:
获取费用数据的方法如下:
public ViewModel FetchSummaryData(Expenses expenses)
{
DynamicParameters param = new DynamicParameters();
ViewModel viewModel = new ViewModel();
param.Add("@flag", expenses.flag);
var result = db.QueryMultiple("sp_Summary", param, commandType: CommandType.StoredProcedure);
if (result != null)
{
viewModel.Category = result.Read<Category>();
viewModel.Expenses = result.Read<Expenses>();
}
return viewModel;
}
如您所见,该特定 ExpenseID 的类别和付款模式始终为空。如何使用 Dapper 填充这些对象的属性? 谢谢。
我想您有一个 Expenses table 与 PaymentModes 和 Category table 有关系 1:1。在这种情况下,您的 sp 应该 return 来自 Expenses table 的所有记录,首先列出 Expenses 字段,然后是 PaymentModes 字段,最后是 Category 字段。像这样
select e.*, p.PaymentModeId, p.PaymentMode, c.CategoryID, c.CategoryName
from tbl_Expenses e inner join PaymentModes p on e.PaymentModeID = p.PaymentModeID
inner join Category c on e.CategoryID = c.CategoryID
where ......
如果您与 PaymentModes 和类别 table 没有关系,但所有内容都存储在单个费用 table 中,那么您不需要连接,只需在正确的顺序让 Dapper 知道如何使用你的字段来填充所需的对象
select ExpenseID, Price, ExpenseDate, .....,
PaymentModeID, PaymentMode,
CategoryID, CategoryName
from tbl_Expenses
where ....
无论如何你运行你的查询
var result = db.Query<Expenses, PaymentModes, Category, Expenses>("sp_Summary",
(e,p,c) =>
{
e.PaymentModes = p;
e.Category = c;
return e;
}, splitOn: "PaymentModeID,CategoryID", param: param, commandType: CommandType.StoredProcedure);
此时结果变量是 IEnumerable<Expense>
,具有正确的 PaymentModes 和 Category 集。
splitOn 参数允许 Dapper 知道在调用 Query 方法所需的三个对象中应该在哪个字段上分隔结果数据。
因此,将 PaymentModeID 之前的所有字段分配给 Expenses 变量,然后将 CategoryID 之前的字段分配给 PaymentModes 变量,最后分配给 Category 变量的字段传递给 lambda 表达式。
在 lambda 内部,您只需将 p 和 c 变量分配给 Expenses 变量的适当字段并满足 Func 签名 return 支出变量