【发布时间】:2014-05-17 09:37:47
【问题描述】:
我试图在包含 10000 多条记录的数据库表上实现即时搜索。
当搜索文本框内的文本发生变化时开始搜索,当搜索框变空时我想调用一个不同的方法来加载所有数据。
此外,如果用户在加载另一个搜索的结果时更改了搜索字符串,那么这些结果的加载应该停止以支持新的搜索。
我像下面的代码一样实现了它,但我想知道是否有更好或更清洁的方法来使用 Rx(反应性扩展)运算符来实现它,我觉得在第一个 observable 的 subscribe 方法中创建第二个 observable 是比声明式更具命令性,if 语句也是如此。
var searchStream = Observable.FromEventPattern(s => txtSearch.TextChanged += s, s => txtSearch.TextChanged -= s)
.Throttle(TimeSpan.FromMilliseconds(300))
.Select(evt =>
{
var txtbox = evt.Sender as TextBox;
return txtbox.Text;
}
);
searchStream
.DistinctUntilChanged()
.ObserveOn(SynchronizationContext.Current)
.Subscribe(searchTerm =>
{
this.parties.Clear();
this.partyBindingSource.ResetBindings(false);
long partyCount;
var foundParties = string.IsNullOrEmpty(searchTerm) ? partyRepository.GetAll(out partyCount) : partyRepository.SearchByNameAndNotes(searchTerm);
foundParties
.ToObservable(Scheduler.Default)
.TakeUntil(searchStream)
.Buffer(500)
.ObserveOn(SynchronizationContext.Current)
.Subscribe(searchResults =>
{
this.parties.AddRange(searchResults);
this.partyBindingSource.ResetBindings(false);
}
, innerEx =>
{
}
, () => { }
);
}
, ex =>
{
}
, () =>
{
}
);
SearchByNameAndNotes 方法只是使用 SQLite 通过从数据读取器读取数据返回一个 IEnumerable<Party>。
【问题讨论】:
-
SearchAsync 到底在做什么?
-
为什么从 SearchAsync 和您的订阅方法调用 SearchByNameAndNotes?
-
@ChristopherHarris 谢谢你的笔记,我对第二个错误表示歉意,
SelectMany子句是另一次尝试的一部分。在我的原始代码中有注释,问题的最终版本没有错误(我希望)。
标签: c# .net system.reactive reactive-programming