使用相同表的Dapper.NET组合

时间:2015-04-13 18:44:22

标签: .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;}
  public DateTime Date {get;set;}
}

查询它并在Customer对象中填充ExtraData的最佳方法是什么?

编辑:

我将问题扩展到更复杂的场景,因为XenoPuTtSs的答案解决了第一个问题但不适用于此问题。

现在假设我有一个联接到地址表。 splitOn选项将拆分结果以创建ExtraData,但无法拆分以创建地址。

我看到使用splitOn的另一个问题。我们无法安全地使用Select *因为如果我们用更多字段更改表格,我们必须始终记住将分割字段移动到底部。或者我们将始终必须在Select命令中以安全顺序描述所有字段。

2 个答案:

答案 0 :(得分:2)

我只是为自己看这个。这就是我想出来的,改变了你的情景。

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;
}

答案 1 :(得分:1)

splitOn:&#34; Id,ExtraDataValue,Id&#34;我相信这可以回答您对该问题的最新演绎。现在您有一个联接地址,它会填充客户对象的地址部分。

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;
}