Длинный LINQ-запрос ломает SQLite-парсер - упрощаете? - PullRequest
1 голос
/ 14 апреля 2011

Я программирую поиск базы данных 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, поэтому я всегда генерировал длинные операторы.

Единственное решение, о котором я могу подумать сейчас, - это действительно собирать данные после каждого «подзапроса» и выполнять объединение с фактическими данными, а не с утверждением. Есть идеи?

1 Ответ

0 голосов
/ 14 апреля 2011

Для чего-то подобного вы можете использовать PredicateBuilder , как показано в выбранном ответе на этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...