我正在使用c#和LINQ编程搜索sqlite数据库。搜索的思想是,您可以提供一个或多个关键字,其中任何一个关键字必须包含在要添加到结果中的该行的任何几个列项中。该实现由几个链接查询组成,这些查询都通过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语句,所以我正在生成长语句,不管。
我现在能想到的唯一解决方案,就是在每个"子查询"之后真正收集数据,并对实际数据进行联合,而不是在语句中。什么好主意吗?
对于这种情况,您可能需要使用PredicateBuilder,如本问题的选择答案所示。