如何使用字符串作为参数遍历 Dapper 动态查询结果?

Posted

技术标签:

【中文标题】如何使用字符串作为参数遍历 Dapper 动态查询结果?【英文标题】:How do I loop through Dapper dynamic query results using strings as parameters? 【发布时间】:2020-06-18 11:23:47 【问题描述】:

所以我遇到了这段代码:

dynamic account = conn.Query<dynamic>(@"
                SELECT Name, Address, Country
                FROM Account
        WHERE Id = @Id", new  Id = Id ).FirstOrDefault();
Console.WriteLine(account.Name);
Console.WriteLine(account.Address);
Console.WriteLine(account.Country);

(How to return dynamic types List<dynamic> with Dapper ORM).

我想知道如何使用字符串作为参数来做同样的事情。有点像:

dynamic account = conn.Query<dynamic>($@"
                SELECT commaseperated(parameters)
                FROM Account
        WHERE Id = @Id", new  Id = Id ).FirstOrDefault();
Console.WriteLine(account[parameters[0]]);
Console.WriteLine(account[parameters[1]]);

其中参数是字符串[] 类型。所有结果都是字符串类型,因此甚至可能不需要使用动态。

【问题讨论】:

so using dynamic may not even be necessary宾果游戏!对于这个简单的用例,不需要引入动态类型。 那么如何使用字符串参数循环遍历结果呢?如果我遍历查询结果,我只会得到第一个参数,如下所示: var res = connection.Query(@$"SELECT parameters.addCommas() FROM..."); foreach(string s in res) //s 只是第一列/参数 试试connection.Query&lt;IEnumerable&lt;string&gt;&gt;(...) 【参考方案1】:

我假设你可以这样做:

        string[] parameters = new string[]  "param1", "param2" ;

        dynamic account = conn.Query<dynamic>($@"SELECT String.Join(",", parameters) FROM Account WHERE Id = @Id", new  Id ).FirstOrDefault();

        foreach (string s in parameters)
        
            Console.WriteLine(account.GetType().GetProperty(s).GetValue(account, null));
        

        Console.ReadLine();

【讨论】:

我不能在动态上调用 GetType()。我没有查询任何类型的对象,只是随机列中的随机字符串

以上是关于如何使用字符串作为参数遍历 Dapper 动态查询结果?的主要内容,如果未能解决你的问题,请参考以下文章

dapper利用DynamicParameters构建动态参数查询

如何在 Dapper Query 的动态参数中传递多个条件,就像我们为 IN 运算符传递的一样

Dapper 传递动态参数

DB2 - 使用带有字符串数组参数的 Dapper 选择查询将不会返回正确的结果

我想使用 dapper 在 Oracle 和 SQL 数据库上执行参数化查询

使用Dapper时,如何将MySqlParameters[] 变成Dapper.DynamicParameters动态对象