【发布时间】:2021-10-15 08:30:28
【问题描述】:
现状
我有一个包含很多条目的数据库。通过搜索字段,只应显示与搜索条件相对应的结果。整个程序应该尽可能高效地运行。
问题
数据必须过滤多次,过滤器可以重置。 由于我想尽可能高效,所以我现在问自己,通过 EF-Core 执行此操作是否更好,即 SQL 或过滤列表?
思考
我考虑过使用 EF-Core 为每个过滤器规范向数据库发送一个新查询。但是,查询可能需要很长时间才能完成,并且输入文本通常会迅速变化。我的另一种方法是首先从数据库中读取所有数据并将其存储在一个列表中。然后我必须存储并显示一个新的过滤列表。使用这种方法,我的记忆中会出现两次列表。
会不会有另一种可能性,我在这里没有考虑到?
注意:我无法过滤当前列表,因为我继续使用它并且 我正在使用 MVVM。
编辑: 我正在使用一个数据集,它有超过 10'000 条记录。大多数列是字符串,长度在 10 到 100 个字符之间。我需要搜索所有这些字符,以找到包含的搜索热。我必须在每次按键时过滤数据源,所以我不能破坏输入。该数据库位于本地移动设备上。我的问题是,最快的方法是什么?
查询当前由 EF-Core 生成,代码如下:
where : b => b.Username.Contains(search) || b.Name.Contains(search) || b.Country.State.Contains(search);
`
public static async Task<IEnumerable<Person>> ReadTablesAsync(Expression<Func<Person, bool>> where = null)
{
using (MobileDbContext ctx = GetMobileDbContext())
{
var queryInclude = ctx.Person.Include(b => b.Country).OrderBy(b => b.Username);
return where != null ? queryInclude.Where(where).ToList() : queryInclude.ToList();
}
}
`
//From the database. This list will not be changed.
IEnumerable<Person> listFromDB = await MobileDataStore.PersonenLesenAsync();
//Create on every search therm a new filtered list
ObservableCollection<Person> filteringList = new ObservableCollection<Person>();
filteringList.Clear();
filteringList.AddRange(listFromDB.Where(where);
示例:
我需要找到一个名为“Karl”的人,但在代码中我不知道是姓名、用户名、国家还是其他内容。所以我必须搜索所有记录以显示可能的结果。
【问题讨论】:
-
你没有给任何人足够的背景来帮助你。数据集有多大?与您正在运行的目标机器相比,它在内存中的占用量是多少?查询是什么样的?您是否限制输入文本以确保在用户停止输入之前不会淹没应用程序?在任何人给你一个合理的建议之前,可能还有十几个问题需要问和回答。
-
一个例子而不是描述也可以有很大帮助
-
the input text often changes rapidly.使用 debounce 定期启动查询,而不是在每次按键时。 -
最快的方法是将所有内容都保存在内存中。由于您尚未指定数据库的总大小,因此我们无法提供进一步的建议。
标签: c# list sorting filter entity-framework-core