我有以下数据库查询:
var task = Task.Run(() => _localDatabase.Table<ArticleData>().Where(article =>
article.ArticleName!.ToLower().Contains(searchQuery.ToLower()))
.Skip(startIndex ?? 0).Take(requestedNumberOfItems ?? 5).ToList());
其缺点是已搜索的文本必须是文章名称的一部分。但有时,用户只输入部分单词(文章名称为
Spider-Man: Across the Spider-Verse
,用户搜索man
和verse
)。所以我将搜索查询分成各个部分:
string[] splitQuerry = searchQuery.Split(' ');
并尝试寻找各个部分:
var task = Task.Run(() => _localDatabase.Table<ArticleData>().Where(article =>
splitQuerry.All<string>(querryPart => article.ArticleName!.Contains(querryPart)))
.Skip(startIndex ?? 0).Take(requestedNumberOfItems ?? 5).ToList());
从理论上讲,听起来很棒,但在实践中,我遇到了
Cannot compile: Lambda
例外。
我需要一种方法将类似 all 方法或类似 this 的内容打包到 Linq-Expression 中。
您可以对 splitQuerry 中的每个项目使用单独的
Where
子句:
var query = _localDatabase.Table<ArticleData>().Select(x => x);
foreach(var item in splitQuerry )
{
query = query.Where(article => article.ArticleName!.ToLower().Contains(searchQuery.ToLower()));
}
query = .Skip(startIndex ?? 0).Take(requestedNumberOfItems ?? 5);
var result = query.ToList();
不知道你用的是哪个数据库框架。我认为它是实体框架。在这种情况下,您需要在第一行调用 select,以便从您的
IQueryable<T>
中获取 DataSet<T>
。