4

我正在开发一种在非常大的表中搜索信息的方法。由于我没有ORDER BY在查询中使用或任何特殊的东西(只是一个简单的SELECT id,description FROM complain WHERE description like 'YOUR TEXT HERE'"),我希望通过返回批量结果来提供更动态的用户体验。这类似于在 Management Studio 中运行查询。

一些细节,我的调用堆栈不大,但并非所有内容都在同一个方法中。有buttonSearchClick,performCleanSearch并且searchComplainBasedOnDetailInfo每一个都在不同的层(分别为接口、SearchBLL 和 SearchDAL)。

我考虑过创建一个异步方法来填充类似 aList<Complain>但看起来不那么干净的东西。我将不得不进行 3 层异步。有没有人对如何实现这一点有更好的想法?或者这是最好的方法吗?

Edit1:我已经设法在连接字符串上使用 SqlCommand.BeginExecuteReader 和异步处理来从查询中获取结果,因为它们出现了......现在我必须想办法让我的 DAL 方法异步所以上层也可以异步获取结果......我正在考虑实现某种缓冲区......也许是一个队列......

Edit2:我不是在寻找分页解决方案或 twitter 之类的(滚动并搜索新结果),因为我知道用户将不得不阅读我获取的所有信息......

4

2 回答 2

1

您可以使用 a BackgroundWorkerand 在您DoWork的批次中执行以下操作:

DataTable dt;
int iRecords = 0;
do
{
  dt = new DataTable();
  using(SqlConnection con = new SqlConnection(""))
  {
    SqlCommand cmd = new SqlCommand(string.Format("SELECT TOP 100 * FROM complain where ID > {0}", iRecords));
    SqlDataAdapter sda = new SqlDataAdapter(cmd);
    sda.Fill(dt);
    //Report your progress here
  }
} while(dt.Rows.Count != 0) 
于 2013-03-13T14:21:06.273 回答
0

您可以从您的方法返回一个IEnumerable<Task<IEnumerable<T>>>(T 将设置为您的项目的任何类型)。每个Task<IEnumerable<T>>将代表未来可能收到的一批信息。该方法本身可以是一个迭代器块,它在获取每个批次时产生每个批次,或者根据您的查询方法,您可以批量处理整个序列而无需编写迭代器块。

然后从调用者的角度来看,他们可以这样写:

foreach(Task<IEnumerable<T> batch in GetBatches())
{
    updateUIWithBatch(await batch);
}
于 2013-03-13T14:28:52.270 回答