我正在编写使用C#和LINQ搜索SQLite数据库的程序。 搜索的想法是,您可以提供一个或多个关键字,其中任何关键字都必须包含在要添加到结果中的该行的任何几个列条目中。 实现包含几个linq查询,这些查询都由union组合在一起。必须考虑的更多关键字和列会以这种方式导致更复杂的查询。这可能导致SQL代码,这对SQLite解析器来说很长。
以下是一些示例代码:
IQueryable<Reference> query = null;
if (searchAuthor)
foreach (string w in words)
{
string word = w;
var result = from r in _dbConnection.GetTable<Reference>()
where r.ReferenceAuthor.Any(a => a.Person.LastName.Contains(word) || a.Person.FirstName.Contains(word))
orderby r.Title
select r;
query = query == null ? result : query.Union(result);
}
if (searchTitle)
foreach (string word in words)
{
var result = from r in _dbConnection.GetTable<Reference>()
where r.Title.Contains(word)
orderby r.Title
select r;
query = query == null ? result : query.Union(result);
}
//...
有没有办法以一种导致更紧凑的SQL的方式构造查询? 我试图通过在每次循环后对查询调用GetEnumerator()来强制创建较小的SQL语句。但显然Union()不对数据进行操作,而是对底层的LINQ / SQL语句进行操作,所以无论如何我都会生成长语句。
我现在能想到的唯一解决方案是在每个“子查询”之后真正收集数据,并在实际数据上而不是在语句中进行联合。有什么想法吗?