C# SQLite和Linq未给出预期结果的Queryable.Intersect()

C# SQLite和Linq未给出预期结果的Queryable.Intersect(),c#,linq,sqlite,intersect,C#,Linq,Sqlite,Intersect,我想通过几个关键字搜索图书数据库。我提供的关键词越多,搜索范围就越窄。这是我的密码: var words = text.Split(' '); IQueryable<Reference> query = null; foreach (string word in words) { var result = from r in _dbConnection.GetTable<Reference>() where r.Title.C

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

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);
var words=text.Split(“”);
IQueryable查询=null;
foreach(单词中的字符串)
{
var result=来自_dbConnection.GetTable()中的r
其中r.Title.包含(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
选择r;
query=query==null?结果:query.Intersect(结果);
}
OrderBy(r=>r.Title);
问题是,我提供的关键词越多,搜索范围实际上就越窄。结果甚至因我提供关键字的顺序而异。 此外,如果涉及多个关键字,最后一个OrderBy()调用也不能可靠地工作。我的想法有缺陷吗?或者我实施它的方式有缺陷吗?

你变化无常,遇到了问题

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

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

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

我正在使用System.Data.SQLite.SQLiteConnection和System.Data.Linq.DataContext。另一种解决方法是在每次迭代时调用
ToArray()。但是,您的表现可能会受到影响。我不推荐这种“变通方法”,因为您所说的正是原因。它隐藏了一个问题,意味着代码无法扩展。稍后可能会有人来修复性能问题,并意外地重新引入当前的bug。啊哈,似乎就是这样。谢谢