20

を含む列で分割しようとしている dapper の MultiMaps に問題がありますNULL。Dapper はオブジェクトをインスタンス化していないようで、私のマッピング関数は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();たという事実が原因です。catnull

このメソッドを Assert クラスにも追加しました。

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

3 に答える 3

21

これは「設計による」ものですが、再検討してもかまいません。

特に、この動作は左結合を支援するためにあります。これを例に取ってください:

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();
于 2012-05-29T00:04:04.737 に答える