Dapper MultiMap funktioniert nicht mit splitOn mit NULL-Wert

dapper

Frage

Ich habe ein Problem mit MultiMaps in Dapper versuchen, auf Spalte, die NULL enthält zu teilen. Dapper scheint das Objekt nicht zu instanziieren, und meine Mapping-Funktion erhält null anstelle des Objekts.

Hier ist mein neuer 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();
    }

Die product.Category.IsNotNull(); Zeile lautet product.Category.IsNotNull(); aufgrund der Tatsache, dass cat an Mapping-Funktion übergeben ist null .

Ich habe diese Methode auch zur Assert-Klasse hinzugefügt:

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

Akzeptierte Antwort

Dies ist "By-Design", aber ich wäre in Ordnung, es noch einmal zu besuchen.

Insbesondere ist dieses Verhalten bei linken Joins hilfreich. Nehmt das zum Beispiel:

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

Das Problem ist, dass, wenn wir eine "pauschale" Erstellung eines Driver Objekts zulassen, jedes Car einen Driver sogar solche, bei denen der Join fehlgeschlagen ist.

Um dies zu umgehen, könnten wir das gesamte segmentierte Segment scannen und sicherstellen, dass ALLE Werte NULL bevor ein NULL Objekt zugeordnet wird. Dies hat eine sehr geringe Auswirkung auf den Multi-Mapper.

Um eine Problemumgehung für Ihren Fall zu umgehen, können Sie eine Ersatzspalte einfügen:

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

Beliebte Antwort

Für alle, die Visualisierung wollen:

Dapper spaltet nach dem letzten gleichen Spaltennamen:

Bildbeschreibung hier eingeben

Lassen Sie uns den Standort der Spalten vertauschen:

Bildbeschreibung hier eingeben

Null-Problem:

Bildbeschreibung hier eingeben

Vertauschte Spalte null:

Bildbeschreibung hier eingeben

Spliton zur Rettung:

Bildbeschreibung hier eingeben



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum