使用相同表的Dapper.NET组合
我有一个表,但我想将它映射为两个类之间的组合 假设我有一个带有以下字段的Customer表:Id、Name、ExtraDataValue、ExtraDataDate使用相同表的Dapper.NET组合,.net,orm,dapper,composition,.net,Orm,Dapper,Composition,我有一个表,但我想将它映射为两个类之间的组合 假设我有一个带有以下字段的Customer表:Id、Name、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;} pu
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;}
}
查询它并在客户对象内填充额外数据的最佳方式是什么
编辑:
我将把这个问题扩展到更复杂的场景,因为XenoPuTtSs的答案解决了第一个问题,但不适用于这个问题
假设现在我有一个到地址表的连接。splitOn选项将拆分结果以创建外部数据,但无法拆分以创建地址
我发现使用splitOn还有另一个问题。我们不能安全地使用Select*,因为如果我们用更多的字段修改表,我们必须始终记住将拆分字段移到底部。或者,我们将始终必须在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;
}
class客户
{
公共int Id{get;set;}
公共int名称{get;set;}
公共外部数据额外{get;set;}
}
类外部数据
{
公共int值{get;set;}
公共整数日期{get;set;}
}
使用(var conn=DatabaseService.CreateConnection())
{
var t=conn.Query(@)
挑选
客户编号作为Id,
客户名称作为名称,
ex_数据1作为值,
交货日期作为交货日期
来自客户
",
(客户,额外)=>
{
客户额外=额外;
返回客户;
},
斯普利顿:“价值”);
返回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;
}
class客户
{
公共int Id{get;set;}
公共int名称{get;set;}
公共外部数据额外{get;set;}
公共广播地址{get;set;}
}
类外部数据
{
公共int值{get;set;}
公共整数日期{get;set;}
}
班级地址{
公共字符串line1{get;set;}
}
使用(var conn=DatabaseService.CreateConnection())
{
var t=conn.Query(@)
挑选
c、 客户编号作为Id,
c、 客户名称作为名称,
c、 ex_数据1作为值,
c、 ex_日期作为日期,
a*
来自客户c
在c.addressid=a.addressid上加入地址a
",
(客户,额外,地址)=>
{
客户额外=额外;
客户地址=地址;
返回客户;
},
splitOn:“Id,Value,Id”);
返回t;
}
我测试了您的解决方案,它运行正常,但在我的案例中不起作用,因为我与其他表有一个联接。我真的不知道我是否应该将你的答案标记为解决方案,因为它并不是在所有情况下都有效。我知道这是一个很小的限制,也许我们没有更好的解决方案。我会等一会儿,看看我们是否有别的想法。谢谢。你能把你的疑问贴出来吗?我更新了我的答案,使一个查询连接到“extraData”表。对不起,我不够清楚。ExtraData在同一个表中,就像您第一次编码的一样。我有一个与另一个表(不是ExtraData)的连接。在我的例子中,它是一个地址表。我认为你应该回到上一个答案,因为这是正确的。我同意你所说的“选择*”,但出于同样的原因,在任何地方这样做通常都是不好的做法。之所以使用splitOn,是因为默认键不是“Id”,但在本例中,我确实需要所有字段,所以选择*是完美的。我现在理解了splitOn的用法,但在这种情况下它有一个问题。我想按字段名(ExtraData)和键(Address Table)进行拆分。如果它接受拆分选项列表,可能会更好。类似splitOn:new{“Id”,“ExtraDataValue”}splitOn:“Value1,Id,SomethingElse,chicks”现在我发现这是不必要的。splitOn参数被“Id”旁边的其他值使用。忘记这个注释吧。我错了。看看我在另一个答案中的评论。我也尝试过这个选项,但它不起作用。我总是会遇到这样的错误:“当使用多重映射API时,如果您有Id以外的键,请确保设置splitOn参数”。我已经设置了splitOn,但它只在没有连接的情况下工作。也许我做错了什么,它起作用了!我不得不使用splitOn:“Id,ExtraDataValue,Id”。客户的第一个Id和地址的最后一个Id。很奇怪,但它奏效了。谢谢。你想改变你的答案吗?我想投票作为解决办法。