Dapper MultiMap non funziona con splitOn con valore NULL

dapper

Domanda

Ho un problema con MultiMaps nel dapper che prova a dividere sulla colonna che contiene NULL . Dapper sembra non istanziare l'oggetto e la mia funzione di mappatura riceve null anziché oggetto.

Ecco il mio nuovo test:

    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 riga che non riesce è product.Category.IsNotNull(); dovuto al fatto che il cat passato alla funzione di mappatura è null .

Ho anche aggiunto questo metodo per affermare la classe:

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

Risposta accettata

Questo è "by-design", anche se sarei ok per rivederlo.

In particolare questo comportamento è lì per aiutare con i join di sinistra. Prendi questo ad esempio:

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

Il problema è che se permettiamo una creazione "coperta" di un oggetto Driver , ogni Car avrà un Driver anche in cui il join fallisce.

Per ovviare a questo problema, è possibile eseguire la scansione dell'intero segmento diviso e assicurarsi che TUTTI i valori siano NULL prima di mappare un oggetto NULL . Questo avrà un impatto perf minimo sul multi-mapper.

Per risolvere il problema, è possibile inserire una colonna surrogata:

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();

Risposta popolare

Per tutti coloro che desiderano la visualizzazione:

Dapper si divide con l'ultimo nome di colonna uguale:

inserisci la descrizione dell'immagine qui

Scambiamo la posizione delle colonne:

inserisci la descrizione dell'immagine qui

problema null:

inserisci la descrizione dell'immagine qui

Colonna swapped null:

inserisci la descrizione dell'immagine qui

Spliton in soccorso:

inserisci la descrizione dell'immagine qui



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché