如何一次遍历数据集100条记录?c#
本文关键字:记录 100条 数据集 何一次 遍历 | 更新日期: 2023-09-27 18:09:38
我有一个大约4500行的数据集。我把它传递给一个web服务,但在性能问题和超时后,我们希望能够一次传递100行。
如何在c#中实现?
我是否需要将数据集分成100个表,然后循环通过表,或者有一个更简单的方法来发送100行的集合在一个时间?
您可以使用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());