Dapper MultiMapはsplitOnでNULL値を使用できません

dapper

質問

私は、 NULLを含む列を分割しようとすると、マルチマップに問題がありNULL 。 Dapperはオブジェクトをインスタンス化しないようで、マッピング関数はnull代わりにnullを受け取りnull

ここに私の新しいテストがあります:

    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もある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:

ここに画像の説明を入力

救助へのSpliton:

ここに画像の説明を入力



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow