Xamarin Forms中如何让SearchBar同时检索Post类的Title和Location字段?
实现思路
原有逻辑仅对PostClass的Title字段做关键词匹配,要新增Location字段的匹配,只需在Where过滤条件中新增或逻辑的Location匹配规则即可,同时建议补充空值校验,避免字段为null时调用ToLower()触发空引用异常。
核心修改点
将原过滤行:
var results = posts.Where(x => x.Title.ToLower().Contains(keyword.ToLower()));
替换为:
var results = posts.Where(x => // 匹配Title,先判空避免空引用 (x.Title != null && x.Title.ToLower().Contains(keyword.ToLower())) // 新增Location匹配逻辑 || (x.Location != null && x.Location.ToLower().Contains(keyword.ToLower())) );
修改后完整代码
private void searchBarmainPage_TextChanged(object sender, TextChangedEventArgs e) { try { using (SQLiteConnection conn = new SQLiteConnection(App.DatabaseLocation)) { var keyword = e.NewTextValue; conn.CreateTable<PostClass>(); var posts = conn.Table<PostClass>().ToList(); if(keyword.Length >= 1) { // 同时匹配Title和Location var results = posts.Where(x => (x.Title != null && x.Title.ToLower().Contains(keyword.ToLower())) || (x.Location != null && x.Location.ToLower().Contains(keyword.ToLower())) ); listViewMainPage.ItemsSource = results; listViewMainPage.IsVisible = true; } else { listViewMainPage.IsVisible = false; } } } catch (NullReferenceException r) { } catch (Exception m) { } }
可选优化(推荐)
当前逻辑是先把整张表的数据全部加载到内存再做过滤,数据量较大时性能较差,可以直接在SQLite查询层面完成过滤,减少内存开销:
// 去掉.ToList(),直接在IQueryable层面过滤,查询会被转换为SQL语句执行 var results = conn.Table<PostClass>() .Where(x => x.Title.Contains(keyword) || x.Location.Contains(keyword) ).ToList();
注:SQLite的查询默认不区分大小写,不需要额外调用ToLower()处理。
内容的提问来源于stack exchange,提问作者Patrick89
相关产品推荐
相关产品推荐

