以程序方式为Dapper创建动态对象

Yan*_*hon 4 c# t-sql sql-server ado.net dapper

我已经看过很多关于创建ExpandoObject对象等的帖子,但它在我的情况下不起作用.我需要创建一个像这样的对象

var someObj = new {
    term1 = "someValue",
    term2 = "other",
    ...
};
Run Code Online (Sandbox Code Playgroud)

基本上,我们正在使用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);
Run Code Online (Sandbox Code Playgroud)

Yan*_*hon 6

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

简而言之,我们发现了IDynamicParameters这个类只是解决了所有问题Dictionary.

var inTerms = new Dapper.DynamicParameters();

inTerms.Add("@p" + (termIndex++), somveValue);
Run Code Online (Sandbox Code Playgroud)

大家都很开心!

  • 有关信息,您可以在这里混合和匹配方法; 你也可以用常规对象初始化*DynamicParameters,然后添加你需要的任何其他属性.含义:您不需要手动添加*every*属性 (2认同)
  • 这允许我在具有中等信任的托管计划上使用Dapper,因为似乎使用匿名对象作为参数需要Reflection.Emit,这在Medium信任上是不允许的. (2认同)