Dapper MultiMap不適用於具有NULL值的splitOn

dapper

我在dapper嘗試拆分包含NULL列時出現MultiMaps問題。 Dapper似乎沒有實例化對象,我的映射函數接收null而不是object。

這是我的新測試:

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

失敗的行是product.Category.IsNotNull();由於cat傳遞給映射函數的事實是null

我還將此方法添加到Assert類:

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

一般承認的答案

這是“按設計”,雖然我可以重新審視它。

特別是這種行為可以幫助左連接。以此為例:

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

麻煩的是,如果我們允許“毯子”創建一個Driver對象,那麼每輛Car都會有一個連接失敗的Driver

為了解決這個問題,我們可以掃描整個被拆分的段,並確保在映射NULL對象之前所有值都是NULL 。這將對多映射器產生非常小的性能影響。

要解決您的案例,您可以插入代理列:

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

熱門答案

對於所有想要可視化的人:

Dapper按最後一個相等的列名稱拆分:

在此處輸入圖像描述

讓我們交換列的位置:

在此處輸入圖像描述

null問題:

在此處輸入圖像描述

交換列null:

在此處輸入圖像描述

斯普利特救援:

在此處輸入圖像描述



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因