C# Linq All in Where 条件

问题描述 投票:0回答:1

我有以下数据库查询:

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 中。

c# linq lambda
1个回答
0
投票

您可以对 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>

© www.soinside.com 2019 - 2024. All rights reserved.