我正在开发一种在非常大的表中搜索信息的方法。由于我不使用ORDER BY
或查询中的任何特殊内容(只是一个简单的SELECT id,description FROM complain WHERE description like 'YOUR TEXT HERE'"
),我希望通过返回批量结果来提供更加动态的用户体验。这与在Management Studio中运行查询类似。
一些细节,我的调用堆栈并不大,但并非所有内容都采用相同的方法。不同层(分别为Interface,SearchBLL和SearchDAL)中的每一个都有buttonSearchClick
,performCleanSearch
和searchComplainBasedOnDetailInfo
。
我考虑过创建一个异步方法来填充类似List<Complain>
的东西,但这看起来并不干净。我必须制作3层异步。有没有人对如何实现这个有更好的想法?或者这是最好的方法吗?
编辑1:我设法在连接字符串上使用SqlCommand.BeginExecuteReader和异步处理来查询查询中的结果...现在我必须找到一种方法让我的DAL方法是异步的,所以上层也可以获取结果async ...我正在考虑实现某种缓冲...可能是一个队列......
编辑2:我不是在寻找一个寻呼解决方案或推特(滚动和搜索新结果),因为我知道用户必须阅读全部信息即时提取......
答案 0 :(得分:1)
您可以使用BackgroundWorker
并在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)
答案 1 :(得分:0)
您可以从方法中返回IEnumerable<Task<IEnumerable<T>>>
(T将设置为您的项目的任何类型)。每个Task<IEnumerable<T>>
将代表将来可能收到的一批信息。方法本身可以是迭代器块,在获取每个批处理时生成它,或者根据您的查询方法,您可以批量处理整个序列而无需编写迭代器块。
然后从调用者的角度来看,他们可以这样写:
foreach(Task<IEnumerable<T> batch in GetBatches())
{
updateUIWithBatch(await batch);
}