Search code examples
c#dapper

Is such a thing available or doable with Dapper to automatically expand the members of a class


Is there a way to do something like this? Let's say I have two classes:

public class Class_A
{
  public string Name {get;}
  public string Age  {get;}
  public int    Key  {get;}
}
public class Class_B
{
  public string Doors {get;}
  public string Windows  {get;}
  public int    Key  {get;}
}

and then a combined class like this:

public class Class_C
{
  public Class_A CA {get;}
  public Class_B CB {get;}
}

now let's say I am saying

_connection.Query<Class_C>("A SQL that returns results from JOIN of Clas_A and Class_B")

So then it would be able to somehow know what field to map to what. Because otherwise I have to copy paste the fields of those two classes inside the Class_C again like this:

public class Class_C
{
      public string Name {get;}
      public string Age  {get;}
      public string Doors {get;}
      public string Windows {get;}
}

Solution

  • Following your comments, for removing all redundancy you can add a PropertyB to class A and let Dapper to bind that property to the result of your query.

    public class A
    {
        public string Name { get; set; }
        public string Age { get; set; }
        public int Key { get; set; }
        public B PropertyB { get; set; }
    }
    
    public class B
    {
        public string Doors { get; set; }
        public string Windows { get; set; }
        public int Key { get; set; }
    }
    
    

    The query is:

    SELECT * FROM A INNER JOIN B ON A.[Key] = B.[Key];
    

    Results are fields in this order Name, Age, Key, Doors, Windows, Key.

    So if you split by Doors:

    • The group on the left is A (Name, Age, Key)
    • The group on the right is B (Doors, Windows, Key).
    var results = connection.Query<A, B, A>(
            sql,
            (a, b) =>
            {
                a.PropertyB = b;
                return a;
            },
            splitOn: "Doors")
        .Distinct()
        .ToList();
    

    Query<A, B, A> means left is type A, right is type B and the combined result is A generated by the above function.

    For more information see documentation Dapper Multi-Mapping Result. There is support for One-To-One mapping and One-to-Many.