Я программирую поиск базы данных SQLite, используя C # и LINQ.
Идея поиска заключается в том, что вы можете указать одно или несколько ключевых слов, любое из которых должно содержаться в любой из нескольких записей столбцов, чтобы эта строка была добавлена в результаты.
Реализация состоит из нескольких linq-запросов, которые все объединены объединением. Больше ключевых слов и столбцов, которые необходимо учитывать, приводит к более сложному запросу. Это может привести к появлению 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?
Я попытался форсировать создание меньших SQL-статистик, вызывая GetEnumerator () для запроса после каждого цикла. Но, очевидно, Union () работает не с данными, а с базовым оператором LINQ / SQL, поэтому я всегда генерировал длинные операторы.
Единственное решение, о котором я могу подумать сейчас, - это действительно собирать данные после каждого «подзапроса» и выполнять объединение с фактическими данными, а не с утверждением. Есть идеи?