如何一次遍历数据集100条记录?c#

本文关键字:记录 100条 数据集 何一次 遍历 | 更新日期: 2023-09-27 18:09:38

我有一个大约4500行的数据集。我把它传递给一个web服务,但在性能问题和超时后,我们希望能够一次传递100行。

如何在c#中实现?

我是否需要将数据集分成100个表,然后循环通过表,或者有一个更简单的方法来发送100行的集合在一个时间?

如何一次遍历数据集100条记录?c#

您可以使用Linq,特别是Take和CopyToDataTable扩展。

的例子:

    DataSet ds = new DataSet();
    DataTable dt = ds.Tables["YOURDATATABLE"];
    IEnumerable<DataRow> firstHundred = dt.AsEnumerable().Take(100);
    // create datatable from query
    DataTable boundTable = firstHundred.CopyToDataTable<DataRow>();
    //call your web service with 1st hundred
    //
    IEnumerable<DataRow> nextHundred = dt.AsEnumerable().Skip(100).Take(100);
    // and so on
    boundTable = nextHundred.CopyToDataTable<DataRow>();
    //call your web service with 1st hundred
    //

一个简单的for和Linq的例子,考虑到你有4500行,想要按100组分组:

    DataSet ds = new DataSet();
    DataTable dt = ds.Tables["YOURDATATABLE"];
    IEnumerable<DataRow> firstHundred = dt.AsEnumerable().Take(100);
    // create datatable from query
    DataTable boundTable = firstHundred.CopyToDataTable<DataRow>();
    //call your web service with 1st hundred
    //
    int skipCount = 0;
    for (int i = 1; i <= 45; i++)
    {
        skipCount += 100;
        IEnumerable<DataRow> nextHundred = dt.AsEnumerable().Skip(skipCount).Take(100);
        // create datatable from query
        DataTable boundTable = nextHundred.CopyToDataTable<DataRow>();
        // call web service with next hundred and so on
    }
private IEnumerable<IEnumerable<DataRow>> GetChunks(DataTable table, int size)
{
    List<DataRow> chunk = new List<DataRow>(size);
    foreach (DataRow row in table.Rows)
    {
        chunk.Add(row);
        if (chunk.Count == size)
        {
            yield return chunk;
            chunk = new List<DataRow>(size);
        }
    }
    if(chunk.Any()) yield return chunk;
}
//....
DataTable table = dataSet.Tables[yourTable];
var chunks = GetChunks(table, 100);
foreach (IEnumerable<DataRow> chunk in chunks)
    SendChunk(chunk); // <-- Send your chunk of DataRow to webservice

您也可以尝试并行发送数据:

// This would replace the above last two lines
Parallel.ForEach(chunks, chunk => SendChunk(chunk));

虽然我不建议这样做,因为SendChunk是一个I/O操作。

相反,尝试将代码转换为async,您可以获得更好的结果:

// Will execute all tasks at the same time
// SendChunk should return a Task
await Task.WhenAll(chunks.Select(chunk => SendChunk(chunk)).ToArray());