- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从 MySQL 表中逐 block 获取数据。
我有如下表格:
HistoryLogs = 10986119
现在我想从 MyQSL 中逐 block 获取数据并将其传递给 sqlbulk 副本进行处理。我已将批量大小确定为 1000。
例如,如果我有 10000 条记录,那么我的查询将如下所示:
SELECT * FROM tbl LIMIT 0,1000;
SELECT * FROM tbl LIMIT 1000,2000;
SELECT * FROM tbl LIMIT 2000,3000;
SELECT * FROM tbl LIMIT 9000,10000;
所以首先我将从表中获取总记录,然后尝试如下所示:
private int FetchCount(string table)
{
using (MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM " + table, conn))
{
cmd.CommandTimeout = 0;
return cmd.ExecuteNonQuery();
}
}
string query = string.Empty;
string table ="HistoryLogs";
int records = FetchCount(table);
for (int i = 0; i < records / 1000 ; i++) //
{
here I would like to create chunk by chunk query and pass it to Process method
}
private MySqlDataReader Process(MySqlConnection conn, string query)
{
using (MySqlCommand cmd = new MySqlCommand(query, conn))
{
cmd.CommandTimeout = 0;
MySqlDataReader reader = cmd.ExecuteReader();
return reader;
}
}
所以我不知道如何创建分页查询,也不确定我的想法是否正确。
最佳答案
有点不确定您想使用什么技术从数据库中获取数据。
由于 Linq 关键字,我假设您需要一个 Linq 语句,它为您提供具有给定 pageSize 的项目页面。
然而,您不确定如何获取第 X 页的数据。您是否有一个 IQueryable 记录要分成几页(如在 Entity Framework 中 - 强烈推荐),或者您想更改您的SQL 语句,以便它给你第 X 页?
IQueryable 方法
假设您需要类型 T 的记录页并且您有一个 IQueryable<T>
获取类型 T 的所有记录。
IQueryable<T> allRecords = ...;
您想将这个序列分成几页。每个页面都有一个 PageSize
, 一个 PageNr
和一系列记录:
class Page<T>
{
public int PageSize {get; set;}
public int PageNr {get; set;}
public IEnumerable<T> Contents {get; set;}
}
现在要将 AllRecords 分成一系列页面,我使用扩展方法:
public static class PagingExtensions
{
public static IQueryable<Page<T>> ToPages<T>(this IQueryable<T> allRecords, int pageSize)
{
return allRecords.Select( (record, i) => new
{
PageNr = i / pageSize,
Record = record,
})
.GroupBy(item => item.PageNr)
// intermediate result: sequence of IGrouping<int, T>
// where key is pageNr
// and each element in the group are the records for this page
.Select(group => new Page<T>
{
PageNr = group.Key,
PageSize = pageSize,
Contents = (IEnumerable<T>) group
});
}
}
将 MyRecords 序列分成页面的代码将是:
const int pageSize = 1000;
IQueryable<MyRecord> allMyRecords = ...
IQueryable<Page<MyRecord>> pages = allMyRecords.ToPages(1000);
// do what you want with the pages, for example:
foreach (Page<MyRecord> page in pages)
{
Console.WriteLine($"Page {page.PageNr}");
foreach (MyRecord record in Page.Contents)
{
Console.WriteLine(record.ToString());
}
}
请注意,所有使用的函数都使用延迟执行。在您枚举它们之前,不会获取记录。
如果您希望能够在本地内存而不是数据库中的页面中划分集合,请使用 IEnumerable<T>
而不是 IQueryable<T>
.
没有 IQueryable 的方法
如果您没有 IQueryable 来获取所有记录,您要么必须自己创建一个实现它的类,要么根据要获取的页面调整您的 SQL 查询。不过,我不推荐第一种方法。
class Page<T>
{
public Page(SqlConnection conn, int pageNr, int pageSize)
{
this.PageNr = pageNr;
this.PageSize = pageSize;
}
private readonly SqlConnection conn;
public int PageSize {get; private set;}
public int PageNr {get; private set;}
public IEnumerable<T> ReadContents()
{
int offset = this.PageNr * this.PageSize;
int fetch = this.PageSize;
string cmdText = "SELECT col1, col2, ..."
+ " FROM ... "
+ " WHERE ... "
+ " ORDER BY -- "
// this is a MUST there must be ORDER BY statement
//-- the paging comes here
+ $" OFFSET {offset} ROWS"
+ $" FETCH NEXT {fetch} ROWS ONLY;";
using (SqlCommand cmd = new SqlCommand("cmdText, conn))
{
using (var sqlDataReader = cmd.ExecuteQuery())
{
List<T> readItems = sqlDataReader...;
// you know better than I how to use the SqlDataReader
return readItems
}
}
}
}
Fetch/Offset 而不是 Enumerable Skip/Take 的想法来自 Implement paging in SQL在 stackoverflow 上。
关于c# - 如何从表中逐 block 获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41237439/
我的 blockly.js 文件中有以下代码 Blockly.Blocks['account_number'] = { // Other type. init: function() {
首先抱歉我的英语不好,我正在开发 Image Splitter 应用程序并且已经完成,但是现在的要求是当图像被分割(分成几 block /chunks)那么图像 block 的每一 block (ch
#value: 消息的返回值,当发送到一个 block 时,是该 block 中最后一句话的值。所以 [ 1 + 2. 3 + 4. ] value 计算结果为 7。我发现有时很难使用。有没有办法显式
我想构建一个包含 3 div 的响应式导航栏相同的 width和 height . 我申请了 inline-block到每个 block ,我得到一个我不理解的行为。 问题是,第三 block 由 2
我希望使用 Blockly 来允许非技术人员用户指定测试脚本。 它的一部分需要一个文件选择器,但是,我看不到 Blockly 有一个。是吗? 实际上,我找不到完整的标准 block 列表。谁有网址?
仅当您位于父 block 内部时,父 block 的 props.isSelected 才为 true,但当您在该 block 的 innerBlocks 内进行编辑时则不然。 如何从父 block
仅当您位于父 block 内部时,父 block 的 props.isSelected 才为 true,但当您在该 block 的 innerBlocks 内进行编辑时则不然。 如何从父 block
我想创建一个具有不同背景颜色 block 和不同悬停颜色 block 的导航栏 block 。我可以分别创建不同的悬停颜色 block 或不同的背景颜色 block ,但不能一起创建。所以请告诉我如何
我正在使用看到的代码 here定期执行代码: #define DELAY_IN_MS 1000 __block dispatch_time_t next = dispatch_time(DISPATC
为什么 block 必须被复制而不是保留?两者在引擎盖下有什么区别?在什么情况下不需要复制 block (如果有)? 最佳答案 通常,当您分配一个类的实例时,它会进入堆并一直存在,直到它被释放。但是,
我想弄清楚我这样做是否正确: 如果我有一个 block ,我会这样做: __weak MyClass *weakSelf = self; [self performBlock:^{
我想制作一个 4 block 导航菜单,虽然我已经显示了一个 block ,然后单击打开第二个 block ,从第二个开始选择并再次单击出现第三个 block ,第四个 block 相同...这是我的
例如,这样更好吗? try { synchronized (bean) { // Write something } } catch (Int
我想让一只乌龟检查前方小块的颜色并决定移动到哪里。如果前面的补丁不是白色的,那么乌龟向左或向右旋转并移动。我的 If 决策结构中出现错误,显示“此处应为 TRUE?FALSE,而不是 block 列表
我想创建一个 block 对角矩阵,其中对角 block 重复一定次数,非对角 block 都是零矩阵。例如,假设我们从一个矩阵开始: > diag.matrix [,1] [,2] [
我是区 block 链新手。突然我有一个问题,我们是否可以通过区 block 号来访问以太坊区 block 链上之前的区 block 数据。 例如我创建了一个block1、block2。 block
我是区 block 链新手。突然我有一个问题,我们是否可以通过区 block 号来访问以太坊区 block 链上之前的区 block 数据。 例如我创建了一个block1、block2。 block
我创建了一个等距环境,全部使用 Javascript 和 HTML5 (2D Canvas),大部分情况下工作正常。我面临的问题是使用不同高度的图 block ,然后对图 block 上的对象索引进行
这是令我困惑的代码: public Integer getInteger(BlockingQueue queue) { boolean interrupted = false; try
我有一个基于 TPL 数据流的应用程序,它仅使用批处理 block 和操作 block 就可以正常工作。 我已经添加了一个 TransformBlock 以尝试在发布到批处理 block 之前从源中转
我是一名优秀的程序员,十分优秀!