【问题标题】:How to return dynamic values in Dapper如何在 Dapper 中返回动态值
【发布时间】:2018-12-16 16:29:50
【问题描述】:

我有一个查询,我正在返回动态数据,但无法通过 Dapper 检索其文档 (https://github.com/StackExchange/Dapper) 中列出的值。

他们有这样的代码示例:

var rows = connection.Query("select 1 A, 2 B union all select 3, 4");

Assert.Equal(1, (int)rows[0].A);

但是,当我执行以下操作时,我无法访问查询结果的任何成员:

var query = db.Query("SELECT SUM(UserRating) as 'Sum', AVG(UserRating) as 'Average', COUNT(*) as 'Total' FROM ActivityLogs");

query.FirstOrDefault(); // {{DapperRow, Sum= '3', Average = '3', Total = '1'}}
var sum = query[0].Sum; // error!

错误信息:

错误 CS0021:无法将带有 [] 的索引应用于“对象”类型的表达式

如何到达我的领域?

【问题讨论】:

    标签: c# dapper


    【解决方案1】:

    解决方案是做这样的事情。您需要将查询的返回类型添加到dynamic,然后将每一行转换为IDictionary<string, object>。完成此操作后,您将能够通过键获取查询的值,如下所示:

    IEnumerable<dynamic> query = db.Query<dynamic>("SELECT SUM(UserRating) as 'Sum', AVG(UserRating) as 'Average', COUNT(*) as 'Total' FROM ActivityLogs");
    foreach (var rows in query)
    {
        var fields = rows as IDictionary<string, object>;
        var sum = fields["Sum"];
        // ...
    }
    

    我希望它可以帮助其他人!

    【讨论】:

    • var row :p 是 1
    【解决方案2】:

    如果您使用 C# 7 或更高版本,您还可以使用 value tuples 来映射返回的行。这样可以避免使用dynamic,并且具有更好的类型安全性。

    有问题的查询可能如下所示(添加换行符以防止滚动):

    var query = db.Query<(int Sum, int Average, int Total)>(@"
         SELECT SUM(UserRating) as 'Sum',
                AVG(UserRating) as 'Average',
                COUNT(*) as 'Total'
         FROM ActivityLogs");
    
    var firstSum = query.FirstOrDefault().Sum;
    

    【讨论】:

      猜你喜欢
      • 2023-02-01
      • 1970-01-01
      • 2014-12-26
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多