Как построить динамический параметризованный запрос с помощью dapper? - PullRequest
0 голосов
/ 19 февраля 2019

Как построить динамический параметризованный запрос, используя dapper?

У меня есть столбцы и их значения в KeyValuePair

например,

Key   | Value
------| -------
FName | Mohan
LName | O'reily
Gender| Male

Я хочу построить динамический оператор SQL, используяdapper и выполнить его,

    string statement = "SELECT * FROM Employee WHERE 1 = 1 ";
    List<KeyValuePair<string,string>> lst = new List<KeyValuePair<string,string>>();
    lst.Add(new KeyValuePair<string,String>("FName","Kim"));
    lst.Add(new KeyValuePair<string,String>("LName","O'reily"));
    lst.Add(new KeyValuePair<string,String>("Gender","Male"));
    foreach(var kvp in lst)
    {
        statement += " AND "+ kvp.Key +" = '"+ kvp.Value +"'";
    }
    using (var connection = _dataAccessHelper.GetOpenConnection())
    {
      try
      {
           //CommandDefinition cmd = new CommandDefinition(statement);

           var searchResult = await connection.QueryAsync<dynamic>(statement);

Выше запроса не удается, потому что в запросе есть специальный символ.Я обнаружил, что для параметризованных операторов можно использовать CommandDefinition,Как использовать CommandDefinition для выполнения вышеуказанного оператора без каких-либо ошибок?или жеЕсть ли лучший способ построить динамические операторы SQL?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Нет причин использовать список пар ключ-значение для построения оператора SQL с динамическими параметрами.Вы можете просто поместить заполнители в запрос, например @FName из приведенного выше примера, и указать значения этих заполнителей в качестве второго параметра метода QueryAsync, передав анонимный тип с ключами, соответствующими заполнителям, и значениями длядинамические значения, которые вы хотите использовать для запроса.

string statement = "SELECT * FROM Employee WHERE FName=@FName AND LName=@LName AND Gender=@Gender";
...
var searchResult = await connection.QueryAsync<dynamic>(statement, new { FName = "Kim", LName = "O'reily", Gender="Male" });
0 голосов
/ 19 февраля 2019

Не строить запрос как текст.Вы можете использовать Dapper SqlBuilder, он выглядит примерно так:

List<KeyValuePair<string,string>> lst = new List<KeyValuePair<string,string>>();
lst.Add(new KeyValuePair<string,String>("FName","Kim"));
lst.Add(new KeyValuePair<string,String>("LName","O'reily"));
lst.Add(new KeyValuePair<string,String>("Gender","Male"));
var builder = new SqlBuilder();
var select = builder.AddTemplate("select * from Employee /**where**/");
foreach (var kvPair in lst)
{
    builder.Where($"{kvPair.Key} = @{kvPair.Key}", new { kvPair.Value });
}
using (var connection = _dataAccessHelper.GetOpenConnection())
{
    try
    {
        var searchResult = await connection.QueryAsync<dynamic>(select.RawSql, select.Parameters);
    }
    ...

Вы никогда не должны пытаться экранировать параметры самостоятельно, оставьте это Dapper.Тогда вы также будете защищены от SQL-инъекций.

...