程序地为Dapper创建一个动态对象

本文关键字:一个 动态 对象 Dapper 创建 程序 | 更新日期: 2023-09-27 18:04:26

我看过很多关于创建ExpandoObject对象之类的帖子,但它在我的情况下不起作用。我需要创建一个像

这样的对象
var someObj = new {
    term1 = "someValue",
    term2 = "other",
    ...
};

基本上,我们正在使用Dapper,我们需要动态地创建一个查询,其中WHERE子句是从给定的参数数组中生成的。我们不是泛化查询!这是一个接收可变数量参数的单一方法,我们需要在单个列上检查OR的每个值。

现在,唯一可行的解决方案是恢复并直接使用System.Data.SqlClient.SqlConnection,或者有任何方法使此工作?

更新:

这是最有可能应该工作,但没有:

string inWhere = null;
dynamic inTerms = new ExpandoObject();
IDictionary<string, object> inTermsDict = inTerms;
if (!(string.IsNullOrEmpty(filter.Term) || string.IsNullOrWhiteSpace(filter.Term))) {
    inWhere = "(" + string.Join(" OR ", filter.Terms.Select((t, i) => "{0} LIKE @p" + i)) + ")";
    int termIndex = 0;
    foreach (string term in filter.Terms) {
        inTermsDict.Add("p" + (termIndex++), term);
    }
}
// ...
var rows = db.Query("SELECT * FROM {table} WHERE {baseCondition}" +
     (string.IsNullOrEmpty(inWhere) ? "" : string.Format(" AND " + inWhere, "columnName")),
     inTerms as object);

程序地为Dapper创建一个动态对象

只是为了回答我自己的问题,因为我们今天早些时候找到了合适的解决方案。

简单地说,我们找到了IDynamicParameters,这个类简单地解决了所有问题,充当Dictionary

var inTerms = new Dapper.DynamicParameters();
inTerms.Add("@p" + (termIndex++), somveValue);

每个人的快乐!