Dapper 建筑参数表

Dapper building parameter list

我有这个class:

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

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

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

目前,我在 SQL 语句末尾构建要标记的参数字符串的逻辑是这样的:

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

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

dynamic parametersObj = new {};

dynamic parametersObj = new ExpandoObject();

以及对

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

注意:填写动态对象如

conn.QueryAsync(sqlString, parametersObj);

会引发错误

Extension methods cannot be dynamically dispatched

您无需执行任何操作:只需将您的对象作为参数传递即可。 Dapper 只会传入它可以在查询中识别的 properties/parameters ......即使它全部传入:它理解 null.

对象没问题。

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