Dapper MultiMap no funciona con splitOn con valor NULL

dapper

Pregunta

Tengo un problema con MultiMaps en Dapper tratando de dividir en la columna que contiene NULL . Dapper parece no crear una instancia de objeto y mi función de mapeo recibe null lugar de objeto.

Aquí está mi nueva prueba:

    class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public Category Category { get; set; }
    }
    class Category
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    }
    public void TestMultiMapWithSplitWithNullValue()
    {
        var sql = @"select 1 as id, 'abc' as name, NULL as description, 'def' as name";
        var product = connection.Query<Product, Category, Product>(sql, (prod, cat) =>
        {
            prod.Category = cat;
            return prod;
        }, splitOn: "description").First();
        // assertions
        product.Id.IsEqualTo(1);
        product.Name.IsEqualTo("abc");
        product.Category.IsNotNull();
        product.Category.Id.IsEqualTo(0);
        product.Category.Name.IsEqualTo("def");
        product.Category.Description.IsNull();
    }

La línea que falla es product.Category.IsNotNull(); debido al hecho de que el cat pasó a la función de mapeo es null .

También agregué este método a la clase Assert:

public static void IsNotNull(this object obj)
{
    if (obj == null)
    {
        throw new ApplicationException("Expected not null");
    }
}

Respuesta aceptada

Esto es "por diseño", aunque estaría bien para volver a visitarlo.

En particular, este comportamiento está ahí para ayudar con las uniones a la izquierda. Toma esto por ejemplo:

cnn.Query<Car,Driver>("select * from Cars c left join Drivers on c.Id = CarId",
   (c,d) => {c.Driver = d; return c;}) 

El problema es que si permitimos la creación de un objeto " Driver " en forma de "manta", todos los Car tendrán un Driver incluso en los que falle la unión.

Para evitarlo, podríamos escanear todo el segmento que se está dividiendo y asegurar que TODOS los valores sean NULL antes de mapear un objeto NULL . Esto tendrá un impacto mínimo en el multi mapper.

Para solucionar su caso, puede insertar una columna sustituta:

var sql = @"select 1 as id, 'abc' as name, '' as split, 
            NULL as description, 'def' as name";
    var product = connection.Query<Product, Category, Product>(sql, (prod, cat) =>
    {
        prod.Category = cat;
        return prod;
    }, splitOn: "split").First();

Respuesta popular

Para todos los que quieran visualización:

Dapper se divide por el último nombre de columna igual:

enter image description here

Vamos a cambiar la ubicación de las columnas:

enter image description here

problema nulo:

enter image description here

Columna intercambiada nula:

enter image description here

Spliton al rescate:

enter image description here



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