Dapper.NET 使用相同的组合 table
Dapper.NET composition using same table
我有一个 table,但我想将其映射为两个 类 之间的组合。
假设我的客户 table 具有以下字段:Id、名称、ExtraDataValue、ExtraDataDate。
class Customer
{
public int Id {get;set;}
public string Name {get;set;}
public ExtraData Extra {get;set;}
}
class ExtraData
{
public int Value {get;set;}
public DateTime Date {get;set;}
}
查询它并在 Customer 对象中填充 ExtraData 的最佳方法是什么?
编辑:
我会将问题扩展到更复杂的场景,因为 XenoPuTtSs 的答案解决了第一个问题,但不适用于这个问题。
现在假设我有一个地址 table 的连接。 splitOn 选项将拆分结果以创建 ExtraData 但无法拆分以创建地址。
我发现另一个使用 splitOn 的问题。我们不能安全地使用 Select * 因为如果我们用更多字段更改 table ,我们必须始终记住将拆分字段移到底部。或者我们将始终必须在 Select 命令中按安全顺序描述所有字段。
我只是自己查了一下。这是我想出来的,改成你的场景。
class Customer
{
public int Id {get;set;}
public int Name {get;set;}
public ExtraData Extra {get;set;}
}
class ExtraData
{
public int Value {get;set;}
public int Date {get;set;}
}
using (var conn = DatabaseService.CreateConnection())
{
var t = conn.Query<Customer, ExtraData, Customer>(@"
select
cust_num as Id,
cust_name as Name,
ex_data1 as Value,
ex_date as Date
from Customer
",
(cust, extra) =>
{
cust.Extra = extra;
return cust;
},
splitOn: "Value");
return t;
}
splitOn:"Id, ExtraDataValue, Id"我相信这回答了你最新提出的问题。现在您有一个地址连接,它填充了您的客户对象的地址部分。
class Customer
{
public int Id {get;set;}
public int Name {get;set;}
public ExtraData Extra {get;set;}
public Address Address{get;set;}
}
class ExtraData
{
public int Value {get;set;}
public int Date {get;set;}
}
class Address {
public string line1{get;set;}
}
using (var conn = DatabaseService.CreateConnection())
{
var t = conn.Query<Customer, ExtraData, Address, Customer>(@"
select
c.cust_num as Id,
c.cust_name as Name,
c.ex_data1 as Value,
c.ex_date as Date,
a.*
from Customer c
join Address a on c.addressid = a.addressid
",
(cust, extra, address) =>
{
cust.Extra = extra;
cust.Address = address;
return cust;
},
splitOn:"Id, Value, Id");
return t;
}
我有一个 table,但我想将其映射为两个 类 之间的组合。
假设我的客户 table 具有以下字段:Id、名称、ExtraDataValue、ExtraDataDate。
class Customer
{
public int Id {get;set;}
public string Name {get;set;}
public ExtraData Extra {get;set;}
}
class ExtraData
{
public int Value {get;set;}
public DateTime Date {get;set;}
}
查询它并在 Customer 对象中填充 ExtraData 的最佳方法是什么?
编辑:
我会将问题扩展到更复杂的场景,因为 XenoPuTtSs 的答案解决了第一个问题,但不适用于这个问题。
现在假设我有一个地址 table 的连接。 splitOn 选项将拆分结果以创建 ExtraData 但无法拆分以创建地址。
我发现另一个使用 splitOn 的问题。我们不能安全地使用 Select * 因为如果我们用更多字段更改 table ,我们必须始终记住将拆分字段移到底部。或者我们将始终必须在 Select 命令中按安全顺序描述所有字段。
我只是自己查了一下。这是我想出来的,改成你的场景。
class Customer
{
public int Id {get;set;}
public int Name {get;set;}
public ExtraData Extra {get;set;}
}
class ExtraData
{
public int Value {get;set;}
public int Date {get;set;}
}
using (var conn = DatabaseService.CreateConnection())
{
var t = conn.Query<Customer, ExtraData, Customer>(@"
select
cust_num as Id,
cust_name as Name,
ex_data1 as Value,
ex_date as Date
from Customer
",
(cust, extra) =>
{
cust.Extra = extra;
return cust;
},
splitOn: "Value");
return t;
}
splitOn:"Id, ExtraDataValue, Id"我相信这回答了你最新提出的问题。现在您有一个地址连接,它填充了您的客户对象的地址部分。
class Customer
{
public int Id {get;set;}
public int Name {get;set;}
public ExtraData Extra {get;set;}
public Address Address{get;set;}
}
class ExtraData
{
public int Value {get;set;}
public int Date {get;set;}
}
class Address {
public string line1{get;set;}
}
using (var conn = DatabaseService.CreateConnection())
{
var t = conn.Query<Customer, ExtraData, Address, Customer>(@"
select
c.cust_num as Id,
c.cust_name as Name,
c.ex_data1 as Value,
c.ex_date as Date,
a.*
from Customer c
join Address a on c.addressid = a.addressid
",
(cust, extra, address) =>
{
cust.Extra = extra;
cust.Address = address;
return cust;
},
splitOn:"Id, Value, Id");
return t;
}