Cách tạo đối số cho truy vấn Dapper động


86

Tôi có từ điển các giá trị Ví dụ: "Tên": "Alex"

Có cách nào để chuyển điều này cho Dapper làm đối số cho một truy vấn không?

Đây là một ví dụ cho thấy những gì tôi muốn làm.

IDictionary<string, string> args = GetArgsFromSomewhere();
string query = "select * from people where Name = @Name";
var stuff = connection.Query<ExtractionRecord>(query, args);

Câu trả lời:


140

Đúng:

var dbArgs = new DynamicParameters();
foreach(var pair in args) dbArgs.Add(pair.Key, pair.Value);

Sau đó chuyển dbArgsthay cho args:

var stuff = connection.Query<ExtractionRecord>(query, dbArgs);

Ngoài ra, bạn có thể viết lớp triển khai của riêng bạn IDynamicParameters.

Lưu ý rằng nếu bạn đang bắt đầu từ một đối tượng (cách tiếp cận thông thường với dapper), bạn cũng có thể sử dụng mẫu này DynamicParameterslàm điểm bắt đầu:

var dbArgs = new DynamicParameters(templateObject);

25
Lưu ý rằng bạn có thể làm new DynamicParameters(dictionary)và nó sẽ hoạt động tốt.
asgerhallas

1
@asgerhallas điều đó có thể không đúng vào tháng 2, nhưng có: bạn đúng - điều đó chắc chắn đúng bây giờ
Marc Gravell

10
để DynamicParameters (từ điển) mới hoạt động, từ điển phải là IEnumerable <KeyValuePair <string, object >>, chẳng hạn như Dictionary <string, object>. Từ điển <string, string> không hoạt động.
Zar Shardan

17

Tôi biết đây là một câu hỏi cũ (như, 5 tuổi) nhưng tôi đã phải vật lộn với điều tương tự. Câu trả lời đầy đủ nằm trong các bình luận cho câu trả lời khác, nhưng tôi nghĩ rằng tôi sẽ cung cấp một ví dụ đầy đủ ở đây.

string query = "SELECT * FROM MyTableName WHERE Foo = @Foo AND Bar = @Bar";

Dictionary<string, object> dictionary = new Dictionary<string, object>();
dictionary.Add("@Foo", "foo");
dictionary.Add("@Bar", "bar");

var results = connection.Query<MyTableName>(query, new DynamicParameters(dictionary));

Hoặc, để hoàn toàn động, bạn có thể tạo một phương thức như thế này, phương thức này sẽ nhận bất kỳ mô hình nào, bất kỳ truy vấn nào và bất kỳ tập hợp tham số truy vấn nào:

    public static IEnumerable<T> Get<T>(string query, Dictionary<string, object> dictionary)
    {
        IEnumerable<T> entities = connection.Query<T>(query, new DynamicParameters(dictionary));
        return entities;
    }

Và sau đó để gọi phương thức này:

var results = Get<MyTable>(query, dictionary)

CHỈNH SỬA DÀI SAU

Câu trả lời này tiếp tục nhận được sự ủng hộ, vì vậy đây rõ ràng vẫn là một nhu cầu. Tôi đã sử dụng giải pháp này và tạo toàn bộ gói NuGet truy cập dữ liệu được xây dựng trên Dapper. Nó giảm CRUD và các hoạt động truy vấn của bạn thành một dòng mã.

Đây là gói NuGet .


0

Người ta cũng có thể sử dụng một ExpandoObjectlàm tham số của truy vấn, thay vì lớp dành riêng cho Dapper DynamicParameters:

ExpandoObject param = new ExpandoObject();

IDictionary<string, object> paramAsDict = param as IDictionary<string, object>;
paramAsDict.Add("foo", 42);
paramAsDict.Add("bar", "test");

MyRecord stuff = connection.Query<MyRecord>(query, param);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.