gpt4 book ai didi

c# - 带有 SQLite 和 Linq 的 Queryable.Intersect() 未给出预期结果

转载 作者:太空狗 更新时间:2023-10-30 01:10:06 25 4
gpt4 key购买 nike

我想通过几个关键字搜索图书数据库。我提供的关键字越多,搜索范围就越窄。这是我的代码:

var words = text.Split(' ');

IQueryable<Reference> query = null;

foreach (string word in words)
{
var result = from r in _dbConnection.GetTable<Reference>()
where r.Title.Contains(word)
|| r.ReferenceAuthor.Any(a => a.Person.LastName.Contains(word) || a.Person.FirstName.Contains(word))
|| r.ReferenceCategory.Any(c => c.Category.Name.Contains(word))
|| r.ReferenceKeyword.Any(k => k.Keyword.Name.Contains(word))
orderby r.Title
select r;

query = query == null ? result : query.Intersect(result);
}

query.OrderBy(r => r.Title);

问题是,我提供的关键字越多,搜索范围实际上并没有变窄。结果甚至会因我提供关键字的顺序而异。此外,如果涉及多个关键字,最后一次 OrderBy() 调用将无法可靠地工作。是我的想法有缺陷,还是我的实现方式有缺陷?

最佳答案

你是closing over the word变量,并遇到 access to modified closure问题。

在循环的每次迭代中,您都将字符串的值从 words 集合捕获到变量 word 中。但是 LINQ 使用延迟执行,并且您的查询直到循环完成后才会执行,此时您的查询的所有实例都会捕获同一个词变量 - 因此您会看到您的结果随着提供的搜索关键字的顺序而变化.

要解决此问题,请在循环的每次迭代中获取变量的本地副本。

foreach (string w in words)
{
string word = w;
...

关于c# - 带有 SQLite 和 Linq 的 Queryable.Intersect() 未给出预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5375148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com