2014-10-30 17 views
17

Tôi đã sử dụng dapper.net trong khi bây giờ và một trình ánh xạ ORM rất tốt, nó hoạt động tốt với các kiểu động .Net nhưng tôi nhận thấy rằng khi dapper lấy dữ liệu từ cơ sở dữ liệu, nó trả về kiểu Dapper. là bất kỳ cách nào mà tôi có thể trả lại nó trong bất kỳ loại nào khác như System.Dynamic.ExpandoObject?Các kiểu trả về động Dapper

Trả lời

15

Đối tượng DapperRow được thiết kế để chia sẻ nhiều trạng thái giữa các hàng. Ví dụ: nếu bạn tìm nạp 40 hàng, tên cột v.v ... chỉ được lưu trữ sau khi. Nếu chúng tôi sử dụng ExpandoObject, điều này sẽ cần được định cấu hình cho mỗi hàng. Do đó, việc sử dụng DapperRow vì chi tiết thực hiện hậu trường là một điều hiệu quả có chủ ý.

Lưu ý rằng đối tượng được trả về từ các API dynamic cũng có thể được truyền dưới dạng IDictionary<string,object>.

Tuy nhiên, tôi sẽ mở để hỗ trợ các loại khác hỗ trợ việc sử dụng từ điển này - trong đó ExpandoObject là một. Vì vậy, có, nó thể được thay đổi sao cho:

var rows = conn.Query<ExpandoObject>(...); 

công trình. Đơn giản chỉ cần yêu cầu mã số hỗ trợ và mã đó hiện không tồn tại. Vì vậy, "không, nhưng có lẽ trong một tương lai xây dựng".

Cũng lưu ý rằng bạn không cần phải sử dụng DapperRow ... Tất cả các trường hợp được mong đợi là sử dụng API chung để thực hiện các loại của riêng bạn.

25

Chắc chắn!

Theo tài liệu đoan trang sử dụng phương pháp truy vấn và nhận dymanics của bạn:

dynamic account = conn.Query<dynamic>(@" 
        SELECT Name, Address, Country 
        FROM Account 
      WHERE Id = @Id", new { Id = Id }).FirstOrDefault(); 
Console.WriteLine(account.Name); 
Console.WriteLine(account.Address); 
Console.WriteLine(account.Country); 

Như bạn có thể nhìn thấy bạn nhận được một đối tượng năng động và bạn có thể truy cập vào các thuộc tính của nó như là miễn là chúng được xác định rõ trong báo cáo kết quả truy vấn .

Nếu bạn ommit .FirstOrDefault() bạn nhận được IEnumerable<dynamic> mà bạn có thể làm bất cứ điều gì bạn muốn với nó.

8

Tôi gặp vấn đề này và tôi đã giải quyết bằng cách này!

Hàm Query() trả về tập hợp các động lực bên dưới thực tế là Dapper.SqlMapper.DapperRow loại đối tượng. Dapper.SqlMapper.DapperRow là riêng tư. Tôi cần thiết để tự động thêm các thuộc tính cho các đối tượng Dapper.SqlMapper.DapperRow nhưng các đối tượng đó không xuất hiện để làm việc. Kết quả là tôi muốn chuyển đổi Dapper.SqlMapper.DapperRow thành một ExpandoObject.

Tôi có thể xây dựng phương thức trợ giúp chung này như dưới đây.

public class DapperHelpers 
{ 
    public static dynamic ToExpandoObject(object value) 
    { 
     IDictionary<string, object> dapperRowProperties = value as IDictionary<string, object>; 

     IDictionary<string, object> expando = new ExpandoObject(); 

     foreach (KeyValuePair<string, object> property in dapperRowProperties) 
      expando.Add(property.Key, property.Value); 

     return expando as ExpandoObject; 
    } 
} 

Sau đó, bạn có thể sử dụng như thế này:

IEnumerable<ExpandoObject> result = 
      db.SqlConn.Query(sqlScript) 
       .Select(x=> (ExpandoObject)ToExpandoObject(x)); 

tham khảo: dapper-dot-net issues 166

+1

tại sao chúng ta phải chuyển đổi hàng đoan trang để expando đối tượng một cách rõ ràng, nó là convertable qua phương pháp sau đây phải không? var rows = conn.Query (...); –

+1

Có thể trong phiên bản kế tiếp của Dapper hoạt động đúng nhưng trong phiên bản 1.4 mà tôi đã sử dụng, đó là đối tượng được chuyển đổi không có bất kỳ thuộc tính nào. Tôi tìm thấy giải pháp này từ các vấn đề cụ thể. – Behzad

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