【问题标题】:Dapper building parameter listDapper 构建参数列表
【发布时间】:2015-04-22 08:49:42
【问题描述】:

我有这门课:

public class Parameters
{
    public string UserId {get;set;}
    public string OrgId {get;set;}
    public string Roles {get;set;}
}

它从 JSON 字符串反序列化。所以有些属性是null

构建参数列表以传递给 Dapper 的最佳方法是什么。

目前,我在 SQL 语句末尾构建 params 字符串以标记的逻辑如下:

var parameters = string.Empty;
var parametersObj = new { };
if (query.Parameters != null)
{
    if (!string.IsNullOrWhiteSpace(query.Parameters.UserId))
    {
        parameters = string.Format("{0} UserId = @UserId", parameters);
        // parametersObj.UserId = 
    }

    if (!string.IsNullOrWhiteSpace(query.Parameters.OrganisationIdentifier))
    {
        parameters = string.Format("{0}, OrganisationIdentifier = @OrganisationIdentifier", parameters);
    }

    if (!string.IsNullOrWhiteSpace(query.Parameters.Roles))
    {
        parameters = string.Format("{0}, Roles = @Roles", parameters);
    }
}

var sqlString = string.Format("exec {0} {1}", query.DbObjectName, parameters);

conn.QueryAsync<dynamic>(sqlString, )

正如您在parametersObj 中看到的那样,我正在使用JavaScript 动态构建对象的方式。如果我确实使用 dynamic 而不是对象来执行此操作 - 它仍然有效吗?

示例:

var parameters = string.Empty;
dynamic parametersObj = new { };
if (query.Parameters != null)
{
    if (!string.IsNullOrWhiteSpace(query.Parameters.UserId))
    {
        parameters = string.Format("{0} UserId = @UserId", parameters);
        parametersObj.UserId = query.Parameters.UserId;
    }

    if (!string.IsNullOrWhiteSpace(query.Parameters.OrganisationIdentifier))
    {
        parameters = string.Format("{0} OrganisationIdentifier = @OrganisationIdentifier ", parameters);
        parametersObj.OrganisationIdentifier= query.Parameters.OrganisationIdentifier;
    }

    if (!string.IsNullOrWhiteSpace(query.Parameters.Roles))
    {
        parameters = string.Format("{0} Roles = @Roles", parameters);
        parametersObj.Roles= query.Parameters.Roles;
    }
}

var sqlString = string.Format("exec {0} {1}", query.DbObjectName, parameters);

conn.QueryAsync<dynamic>(sqlString, parametersObj);

【问题讨论】:

    标签: c# dapper


    【解决方案1】:

    我认为第二个例子会在你改变时起作用

    dynamic parametersObj = new {};
    

    dynamic parametersObj = new ExpandoObject();
    

    查询到

    conn.QueryAsync(sqlString, new 
    {
        UserId = parametersObj.UserId,
        ...
    };
    

    注意:填写动态对象之类的

    conn.QueryAsync(sqlString, parametersObj);
    

    会引发错误

    扩展方法不能动态调度

    【讨论】:

    • 是的,我最终到了那里,确实使用了这个解决方案——因为我的初始规格发生了变化。但我认为你是对的
    【解决方案2】:

    您不需要做任何事情:只需将您的对象作为参数传递。 Dapper 只会传入它可以在查询中识别的属性/参数……即使它全部传入:它理解 null。

    对象很好。

    ...QueryAsync(sql, query.Parameters)...
    

    【讨论】:

    • query.Parameters 是一个 IEnumerable&lt;&gt; 类,它是 public class Parameter { public string Name {get;set;} public string Type {get;set;} public string Value {get;set;} 并从 JSON 反序列化。所以它不太符合我期望QueryAsync 要求的结构?
    • @CallumLinington 那么query.Parameters.UserId 有什么意义呢?
    • 自从我发布问题以来,我已经更改了模型。所以我想用新模型它不会工作。我还有一个关于 Dapper 和单元测试的问题,我将发布。
    • @CallumLinington 我的回答是基于提出的问题;p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多