【问题标题】:What is the best practice for passing dynamic parameter in WebApi在 WebApi 中传递动态参数的最佳实践是什么
【发布时间】:2021-11-29 22:51:42
【问题描述】:

我的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,可能会导致获取不正确的数据反序列化时输入,有什么更好的方法?

【问题讨论】:

  • 你试图通过哪些不同的对象?
  • @ErmiyaEskandary 不同的action访问不同的数据库表,所以会有不同的查询条件,Employeeaccept name/sex/department,Storeaccept city/brand...,但是我可以' t 定义具有 Name/Sex 此类属性的 EmployeeParameter 类,因为用户可能只是按名称查询,而不关心性别,我不能总是在 sql 中编写 sex=@xx。不知道我说清楚了没有。
  • 不,使用一个类进行验证等,然后使用对象值来构建您的查询 - 只需构建逻辑以不发送性别,例如,如果没有指定
  • @ErmiyaEskandary 问题是null 也是有效值,例如,ReleaseDate 为 null 表示尚未发布,用户可以传递 null 来查询未发布的项目。
  • 这更多是关于逻辑的 - 实际问题是什么?

标签: c# dynamic parameter-passing webapi


【解决方案1】:

您可以创建一个包含名称和值类型等所有详细信息的类,并传递该类的列表/数组。

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

然后 ValueType 类似于"String", "Decimal", "MyOtherClass" 等。 如果您只使用狭义定义的类型,这可能是一个枚举,但这会使未来的扩展更加复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2018-05-10
    • 2021-04-18
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    相关资源
    最近更新 更多