2012-01-24 13 views
16

Tôi đang cố gắng sử dụng Dapper để giao tiếp với các bảng nhà cung cấp thành viên ASP.NET SQL. Tôi đã bọc lớp SqlMembershipProvider và thêm một phương thức bổ sung để cho tôi các MembershipUsers đưa ra một tiêu chí nhất định liên quan đến một số bảng tùy chỉnh mà tôi có.Gọi hàm tạo tùy chỉnh bằng Dapper?

Khi truy vấn dữ liệu bằng Dapper, Dapper lần đầu tiên khởi tạo lớp với hàm tạo ít tham số và sau đó "ánh xạ" các cột được trả về vào các thuộc tính trên đối tượng.

Tuy nhiên, thuộc tính UserName trên lớp MembershipUser không có trình đặt. Đánh giá từ xung quanh dòng 1417 trong Dapper SqlMapper.cs, phương thức GetSettableProps() chỉ nhận được các thuộc tính có thể cài đặt.

Tôi đã cố gắng thực hiện truy vấn MultiMap để gọi hàm tạo, nhưng vấn đề với đó là các đối tượng được truyền vào truy vấn đã bị thiếu UserName.

Tôi đoán tôi có thể sửa đổi phương thức GetSettableProps(), nhưng tôi không chắc liệu điều đó có hiệu quả hay không hoặc liệu nó có ảnh hưởng đến mã hiện tại của tôi hay không.

Có cách nào để tôi gọi hàm tạo tùy chỉnh mà lớp MembershipUser có không?

Hoặc có sự thay đổi hợp lý mà tôi có thể thực hiện cho Dapper để hỗ trợ cho tình huống của tôi không?

** CẬP NHẬT **

câu trả lời của Marc để sử dụng phương pháp phi generic/Query động() là đúng, nhưng đối với hậu thế, đây là phương pháp tôi đã đề cập đến Dapper bên:

static List<PropInfo> GetSettableProps(Type t) 
{ 
    return t 
      .GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) 
      .Select(p => new PropInfo 
      { 
       Name = p.Name, 
       Setter = p.DeclaringType == t ? p.GetSetMethod(true) : p.DeclaringType.GetProperty(p.Name).GetSetMethod(true), 
       Type = p.PropertyType 
      }) 
      .Where(info => info.Setter != null) 
      .ToList(); 
} 
+0

gì Dòng 1417 trông giống như btw bạn có thể đăng dụ mã của bạn cho những người khác mà có lẽ có thể nhanh chóng giúp bạn ..? – MethodMan

+1

Thành thật mà nói, tôi chỉ sử dụng loại trung gian ở đây - hoặc API truy vấn không chung chung (thông qua "động") ... Tôi có một số mã ctor mà tôi có thể nâng từ protobuf-net, nhưng tôi ' m thực sự không chắc chắn nó sẽ có lợi ... –

Trả lời

24

tôi sẽ sử dụng các Query API không chung chung ở đây ...

return connection.Query(sql, args).Select(row => 
    new AnyType((string)row.Foo, (int)row.Bar) { 
     Other = (float)row.Other }).ToList(); 

sử dụng này bạn có thể sử dụng cả hai đồng không mặc định các giáo viên và các bài tập bất động sản, mà không có bất kỳ thay đổi nào, bằng cách sử dụng "động" như một bước trung gian.

+0

Wow, tôi xấu hổ rằng tôi hoàn toàn bỏ lỡ điều đó! –

+3

Cách tiếp cận này sẽ buộc bạn phải đặt rõ ràng tất cả các thuộc tính phải không? Tôi không thể, ví dụ, xây dựng loại của tôi, sau đó có Dapper chạy khóa học của nó trên các thuộc tính với kết quả thiết lập tự động? – crush

+3

Không phải ai cũng làm việc với Framework v4, được yêu cầu cho giải pháp này sử dụng năng động. Dường như bạn có thể lấy đi mà không cần động nếu bạn sử dụng chỉ mục Từ điển để lấy giá trị cột của bạn: do đó, trong đó Marc có (int) row.Bar (hàng là động trong v4 của Dapper)), bạn có thể sử dụng (int) row [" Bar "] (trong hàng Dapper 3.5 là một từ điển) và vân vân. Nó không dễ chịu, nhưng đôi khi có lẽ cần thiết. – Nij

1

tôi sử dụng này có thể nó là giúp đỡ người khác

YourList = connection.Query<YourQueryClass>(Query, arg) 
       .Select(f => new ClassWithConstructor(f.foo,f.bar)) 
       .ToList();