วิธีสร้างอาร์กิวเมนต์สำหรับแบบสอบถาม Dapper แบบไดนามิก


88

ฉันมีพจนานุกรมค่าต่างๆเช่น "ชื่อ": "Alex"

มีวิธีส่งต่อให้ Dapper เป็นอาร์กิวเมนต์สำหรับแบบสอบถามหรือไม่?

นี่คือตัวอย่างที่แสดงถึงสิ่งที่ฉันต้องการทำ

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

คำตอบ:


144

ใช่:

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

จากนั้นผ่านไปdbArgsแทนที่args:

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

IDynamicParametersหรือคุณสามารถเขียนระดับของคุณเองที่นำไปปฏิบัติ

โปรดทราบว่าหากคุณเริ่มต้นจากวัตถุ (วิธีการปกติกับ dapper) คุณสามารถใช้เทมเพลตนี้DynamicParametersเป็นจุดเริ่มต้นได้:

var dbArgs = new DynamicParameters(templateObject);

25
โปรดทราบว่าคุณสามารถทำได้new DynamicParameters(dictionary)และจะได้ผลดี
asgerhallas

1
@asgerhallas ที่อาจจะไม่เป็นจริงในเดือนกุมภาพันธ์ แต่ใช่: คุณพูดถูก - ตอนนี้เป็นเรื่องจริงอย่างแน่นอน
Marc Gravell

11
เพื่อให้ DynamicParameters (พจนานุกรม) ใหม่ทำงานได้พจนานุกรมต้องเป็น <KeyValuePair <string, object >> ที่สามารถใช้งานได้เช่น Dictionary <string, object> พจนานุกรม <string, string> ไม่ทำงาน
Zar Shardan

17

ฉันรู้ว่านี่เป็นคำถามเก่า (เช่นเด็ก 5 ขวบ) แต่ฉันก็ดิ้นรนกับสิ่งเดียวกัน คำตอบที่สมบูรณ์อยู่ในความคิดเห็นของคำตอบอื่น แต่ฉันคิดว่าฉันจะเสนอตัวอย่างเต็มรูปแบบที่นี่

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

หรือเพื่อให้เป็นไดนามิกอย่างสมบูรณ์คุณสามารถสร้างวิธีการเช่นนี้ซึ่งจะใช้โมเดลแบบสอบถามใด ๆ และชุดพารามิเตอร์การสืบค้นใด ๆ :

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

จากนั้นจะเรียกวิธีนี้:

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

แก้ไขนานหลังจาก

คำตอบนี้ยังคงได้รับการโหวตเพิ่มขึ้นดังนั้นจึงยังคงจำเป็น ฉันใช้โซลูชันนี้และสร้างแพ็คเกจ NuGet การเข้าถึงข้อมูลทั้งหมดที่สร้างขึ้นที่ด้านบนของ Dapper จะลด CRUD และการดำเนินการค้นหาของคุณเป็นโค้ดบรรทัดเดียว

นี่คือแพคเกจ NuGet


1

คุณยังสามารถใช้ an ExpandoObjectเป็นพารามิเตอร์ของแบบสอบถามแทนคลาส Dapper-specific 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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.