2012-05-24 23 views
11

Tôi gặp sự cố với MultiMaps trong công cụ tìm bản đồ đang cố gắng tách trên cột chứa NULL. Dapper dường như không khởi tạo đối tượng và hàm ánh xạ của tôi nhận được null thay vì đối tượng.Dapper MultiMap không hoạt động với splitOn với giá trị NULL

Dưới đây là thử nghiệm mới của tôi:

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

Điểm mấu rằng thất bại là product.Category.IsNotNull(); do thực tế rằng cat truyền cho chức năng lập bản đồ là null.

Tôi cũng đã thêm phương pháp này để Khẳng định đẳng cấp:

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

Tôi rất muốn giúp đỡ, ping Paul trên twitter người viết github cho các cửa sổ. Tôi biết họ đang làm việc chăm chỉ để có được dòng này kết thúc vấn đề có thể xử lý –

+0

@SamSaffron - cảm ơn cho bình luận của bạn. Nếu bạn cho tôi biết khi nó được sắp xếp, tôi có thể đẩy các thay đổi của tôi. Bạn có thể sao chép các bài kiểm tra từ bài viết của tôi, mặc dù - nó khá rõ ràng, nơi những thay đổi nên đi ;-) PS. Tôi yêu github cho cửa sổ. Hãy cho tôi biết nếu tôi có thể được giúp đỡ bất kỳ với thử nghiệm. –

+2

Tôi đã gửi một PR cho Dapper mà nên làm cho những vấn đề kết thúc dòng biến mất.Hãy cho tôi biết nếu họ vẫn hiển thị. Đạo đức của câu chuyện: * Sao chép-dán [tệp này] (https://gist.github.com/2802523#file_the+original+guy+used+autocrlffalse) dưới dạng '.gitattributes' nếu người gốc sử dụng' autocrlf = false '* Sao chép-dán [tệp này] (https://gist.github.com/2802523#file_the+original+guy+used+autocrlftrue) dưới dạng' .gitattributes' nếu anh ta sử dụng 'autocrlf = true' –

Trả lời

14

này được "bởi thiết kế" mặc dù tôi sẽ là ok xem lại nó.

Đặc biệt, hành vi này có sẵn để trợ giúp với việc gia nhập trái. Thực hiện việc này ví dụ:

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

Rắc rối là nếu chúng ta cho phép "chăn" tạo ra một đối tượng Driver, mỗi Car sẽ có một Driver ngay cả những nơi join thất bại.

Để làm việc xung quanh, chúng tôi có thể quét toàn bộ phân đoạn được tách ra và đảm bảo TẤT CẢ các giá trị là NULL trước khi ánh xạ đối tượng NULL. Điều này sẽ có một tác động rất nhỏ về perf trên đa bản đồ.

Để workaround cho trường hợp của bạn, bạn có thể chèn một cột thay thế:

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

Cảm ơn câu trả lời - Tôi thấy điểm của bạn. Tôi đã thực hiện workaround tương tự trong dự án của tôi bằng cách sử dụng khóa chính của bảng 'Drivers'. Cột thay thế trống tạo ra sự tạo đối tượng cho mỗi hàng, ngay cả những cái không tham gia trái, vì vậy để tìm các bản ghi thiếu, tôi sẽ cần kiểm tra tất cả các thuộc tính bản thân mình trong hàm ánh xạ. Nó sẽ là tuyệt vời nếu Dapper có thể xử lý nó một cách chung chung thay vì tôi kiểm tra nhiều thuộc tính cho 'NULL' trong nhiều bản đồ. Có lẽ một số lá cờ để cải thiện pefr? Một ví dụ mô tả hơn (http://code.google.com/p/dapper-dot-net/) cũng sẽ được hoan nghênh. –

+1

Tôi chỉ gặp phải vấn đề này và không nhận thức được hành vi này trước thời hạn. Tôi muốn được quan tâm trong ít nhất có một lá cờ 'splitOnNull: true' để tránh vấn đề này. Sẽ phải sử dụng các cột thay thế cho đến lúc đó. –

+0

Chẳng phải ví dụ này có thiếu sót hay không, trong đó bạn có một cột được gọi là "tên" hai lần? –

1

Đối với tất cả những ai muốn hình dung:

chia Dapper bởi tên cột bằng lần cuối:

enter image description here

Hãy trao đổi vị trí của các cột:

vấn đề

enter image description here

null:

enter image description here

hoán đổi cột null:

enter image description here

Spliton để giải cứu:

enter image description here

Các vấn đề liên quan