Dapper .Net: la columna de la tabla y el tipo de propiedad del modelo no coinciden

dapper

Pregunta

En realidad, tengo una consulta que devuelve el resultado que contiene la columna (por ej. Dirección) de tipo varchar, pero el modelo de dominio para esa tabla contiene la propiedad de tipo objeto (por ejemplo Dirección de dirección) .Porque tiene un error que dice que no se pudo transmitir para comentar.No puedo encontrar la manera de resolver este problema con el .net de dapper.

Fragmento de código:

IEnumerable<Account> resultList = conn.Query<Account>(@"
                    SELECT * 
                    FROM Account
                    WHERE shopId = @ShopId", 
new {  ShopId = shopId });

El objeto Cuenta es, por ejemplo.

public class Account {
  public int? Id {get;set;}
  public string Name {get;set;}
  public Address Address {get;set;}
  public string Country {get;set;}
  public int ShopId {get; set;}
}

Como hay una falta de coincidencia de tipos entre la columna de la tabla de la base de datos (Dirección) y la propiedad del modelo de dominio (Dirección), dapper arroja una excepción. Por lo tanto, hay alguna forma de mapear esas propiedades aunque sea apuesto.

Respuesta aceptada

Debido a que existe un desajuste de tipo entre su POCO y su base de datos, deberá proporcionar una asignación entre los dos.

public class Account {
  public int? Id {get;set;}
  public string Name {get;set;}
  public string DBAddress {get;set;}
  public Address Address 
  {
   // Propbably optimize here to only create it once.
   get { return new Address(this.DBAddress); } 
  }

  public string Country {get;set;}
  public int ShopId {get; set;}
}

Algo así: DBAddress la columna db a la propiedad DBAddress (debe proporcionar un alias como SELECT Address as DBAddress lugar de *) y proporcionar un método get en su objeto Address que crea / reutiliza un tipo de Address con los contenidos de el valor db.


Respuesta popular

Otra opción es usar la función Multi-Mapping de Dapper.

public class TheAccount
{
    public int? Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }
    public string Country { get; set; }
    public int ShopId { get; set; }
}

public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
}

public class Class1
{
    [Test]
    public void MultiMappingTest()
    {
        var conn =
            new SqlConnection(
                @"Data Source=.\SQLEXPRESS; Integrated Security=true; Initial Catalog=MyDb");
        conn.Open();

        const string sql = "select Id = 1, Name = 'John Doe', Country = 'USA', ShopId = 99, " +
                           " Street = '123 Elm Street', City = 'Gotham'";

        var result = conn.Query<TheAccount, Address, TheAccount>(sql, 
            (account, address) =>
                {
                    account.Address = address;
                    return account;
                }, splitOn: "Street").First();

        Assert.That(result.Address.Street, Is.Not.Null);
        Assert.That(result.Country, Is.Not.Null);
        Assert.That(result.Name, Is.Not.Null);
    }
}

El único problema que veo con esto es que tendrá que enumerar todos los campos de la cuenta, seguidos de los campos de la dirección en su declaración de selección, para permitir que funcione el splitOn.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow