Как лучше всего передавать динамический параметр в WebAPI

#c# #dynamic #parameter-passing #webapi

Вопрос:

Мой Action :

 [HttpPost]
void Foo(Dictionary<string, object> prm)
{
    var sql = "whatever";
    var sqlPrms = new List<SqlParameter>();

    if (prm.TryGetValue("Condition1",out var c1))
    {
        sql  = " and Condition1=@c1";
        sqlPrms.Add(new SqlParameter("c1", c1));
    }

    if (prm.TryGetValue("Condition2", out var c2))
    {
        sql  = " and Condition2=@c2";
        sqlPrms.Add(new SqlParameter("c2", c2));
    }

    ExecuteSql(sql, sqlPrms);
}
 

Дело в динамических условиях, я не могу определить класс модели параметров, но использовать Dictionary проблему Value можно только object , это может привести к получению неправильного типа данных при десериализации, как лучше?

Комментарии:

1. Через какие различные объекты вы пытаетесь пройти?

2. @ErmiyaEskandary различных действий доступ к другой базе данных таблиц, так что не будет другой запрос условиях, Employee принять имя/пол/департамент, Store принимает город/бренд…, но я не могу определить EmployeeParameter класс с именем/секс такими свойствами, потому что пользователь может просто запрос на имя, не интересует секс, я не могу писать sex=@xx в SQL всегда. Я не знаю, ясно ли я выразился.

3. Нет, используйте класс для проверки и т.д., А затем используйте значения объектов для построения запроса — просто встроите логику, чтобы, например, не отправлять пол, если он не указан

4. @ErmiyaEskandary Проблема заключается в том, что null также является допустимым значением, например, дата выпуска равна нулю, означает, что еще не выпущена, пользователи могут передавать значение null для запроса неизданных элементов.

5. Тогда это больше касается логики — в чем собственно вопрос?

Ответ №1:

Вы можете создать класс, содержащий все сведения, такие как имя и тип значения, и передать список/массив этого класса.

 public class Parameter
{
    public string Name {get;set;}
    public string ValueType {get;set;}
    public object Value {get;set;}
}
 

Тогда тип значения тогда что-то вроде "String", "Decimal", "MyOtherClass" и т. Д.
Если вы работаете только с узко определенными типами, это может быть перечисление, но это усложнит дальнейшее расширение.