Dapper MultiMap ne fonctionne pas avec splitOn avec une valeur NULL

dapper

Question

J'ai un problème avec MultiMaps dans Dapper essayant de diviser sur la colonne qui contient NULL . Dapper ne semble pas instancier l'objet et ma fonction de mappage reçoit null au lieu d'objet.

Voici mon nouveau 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 ligne qui échoue est product.Category.IsNotNull(); En raison du fait que cat passé à la fonction de mappage est null .

J'ai également ajouté cette méthode à la classe Assert:

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

Réponse acceptée

C'est "by-design" bien que je sois d'accord pour le revoir.

En particulier, ce comportement est là pour aider avec les jointures à gauche. Prenons par exemple ceci:

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

Le problème est que si nous permettons une création "en couverture" d'un objet Driver , chaque Car aura un Driver même si la jointure a échoué.

Pour contourner le problème, nous avons pu analyser le segment entier en cours de division et nous assurer que TOUTES les valeurs sont NULL avant de mapper un objet NULL . Cela aura un impact très mineur sur le multi-mappeur.

Pour contourner ce problème, vous pouvez insérer une colonne de substitution:

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

Réponse populaire

Pour tous ceux qui veulent une visualisation:

Dapper se divise par le dernier nom de colonne égal:

entrer la description de l'image ici

Permettons de changer l'emplacement des colonnes:

entrer la description de l'image ici

problème nul:

entrer la description de l'image ici

Colonne échangée null:

entrer la description de l'image ici

Spliton à la rescousse:

entrer la description de l'image ici




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi