【问题标题】:dapper: Get result and count at same time using QueryMultipledapper:使用 QueryMultiple 同时获取结果和计数
【发布时间】:2016-06-08 11:37:24
【问题描述】:

我写了两段 SQL 命令,想在一个查询中处理如下:

SELECT COUNT(*) FROM books

SELECT * FROM books ORDER BY bookID OFFSET 1000 ROWS FETCH NEXT 10 ROWS ONLY

如何使用conn.QueryMultiple方法同时获取countlist of books

顺便说一句:我不想创建任何额外的实体类

【问题讨论】:

    标签: c# sql .net sql-server dapper


    【解决方案1】:

    来自githubexample

    var sql = @"SELECT COUNT(*) FROM books
                SELECT * FROM books ORDER BY bookID OFFSET 1000 ROWS FETCH NEXT 10 ROWS ONLY";
    
    using(var multi = connection.QueryMultiple(sql))
    {
        var count = multi.Read<int>().Single();
        var results = multi.Read<YourObject>().ToList();
    }
    

    【讨论】:

    • 你的意思是,我必须定义自己的Book 类来分隔结果?有没有通用的方法来做到这一点?例如:var books = multi.Read(IList)();
    • @ineztia,我想,你可以得到对象列表或动态的结果
    • 对于额外的功劳,multi 应该在 using 块中,因为它是 IDisposable
    • @ineztia 确实,读取Book 系列记录的最简单 方法是定义一个类Book,它包含所有字段(匹配名称和类型)你想填充。但是,如果这太像艰苦的工作(提示:不应该这样),非通用的Read API 返回IEnumerable&lt;dynamic&gt;,您可以访问.ColumnName 等。我强烈建议在大多数情况下使用通用方法案例。
    【解决方案2】:

    为了更好的性能

    var sql=@"SELECT *,count(*) over() as AllCount
    FROM Books ORDER BY BookId OFFSET 1000 ROWS FETCH NEXT 10 ROWS ONLY"
    
    var result = result = dbConnection.Query<Book, int, Tuple<Book, int>>(sql, Tuple.Create, splitOn:"AllCount").ToList();
    var count = result.Select(c => c.Item2).FirstOrDefault();
    List<Book> list = result.Select(c => c.Item1).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 2022-11-23
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多