我基本上是在寻找我的数据库的“谷歌类型”搜索。
我目前正在创建一个存储书籍(和作者)、游戏电影(以及未来更多)的应用程序。显然,应用程序还需要能够快速搜索数据库中的任何这些项目。
当然,简单地将游戏、书籍和电影搜索分开是没有问题的,但如果我有一个搜索字段来搜索所有内容,我真的会觉得很棒,主要是因为我有时会将书籍与电影混淆 xD
现在起初我认为这是一个很好的方法(只是搜索书籍):
List<Book> books = (from b in le.Book
where (b.Title + " " + b.Author.FirstName + " " +
b.Author.Surname).Contains(search)
select b).OrderBy(b => b.Title).ToList();
这很容易,并且可以在小型数据库中正常工作,并且当您以正确的顺序键入搜索时。所以使用这个搜索看起来像:
The fault in our stars John Green
但如果有人要输入:
John Green The fault in our stars
The fault in our stars - John Green
或者你能想出什么变化,它都会失败。
我确实在这里找到了一个很好的 SQL 查询示例:MYSQL 搜索字段方法,但它在 SQL 中,我不知道如何将其重写为 linq。因为数据库(将要)包含数千条记录,所以我不能只做:
var total = (from b in le.Book
select new { b.ID, FullDescription = (b.Title + " " +
b.Author.FirstName + " " + b.Author.Surname) });
string[] searchArr = search.split(' ');
List<int> ids = new List<int>();
foreach(string s in searchArr)
{
ids.addRange((from t in total
where t.FullDescription.Contains(s).ToList());
}
foreach 循环会减慢它的速度(我知道必须有更好的方法来创建可变数量的 where 语句,但我也不知道该怎么做)。
但是,是的,它var total
会变得巨大。
当然,还有一部分是让它成为实时搜索,所以每次输入一个字符时它都会更新列表视图,所以如果我输入:"jo"
我会得到一个带有结果的列表,然后我可以通过输入进一步定义它,"joh"
但它会是更好地查询我从上次查询中获得的结果列表或重新查询整个数据库?
另外我需要考虑退格,所以如果有人输入"jo"
但想要"ja"
我需要重新查询整个数据库,对吗?
那么这样做的最佳实践是什么?我找到了很多像上面提到的例子,但我正在寻找最快的“用户证明”(这意味着无论搜索多么奇怪,它仍然需要得出正确的结果)
我的数据库模型(仅包含书籍、作者)
PS 我不是最好的数据库设计师,所以如果你发现你会做不同的事情,请告诉我(还有很多东西要学)