Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用相同表的Dapper.NET组合_.net_Orm_Dapper_Composition - Fatal编程技术网

使用相同表的Dapper.NET组合

使用相同表的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

我有一个表,但我想将它映射为两个类之间的组合

假设我有一个带有以下字段的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;}
  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。很奇怪,但它奏效了。谢谢。你想改变你的答案吗?我想投票作为解决办法。