Каков оптимальный способ подсчета количества результатов, которые будут возвращены запросом ODB? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть приложение C ++, которое использует ODB с базой данных SQLite. Я хотел бы посчитать количество результатов, которые будут возвращены любым запросом. В настоящее время я делаю что-то вроде следующего:

using query = odb::query<person>;
auto filteredResults( db.query<person>(query::first == "John") );
const auto count = std::distance( filteredResults.begin(), filteredResults.end() );

Есть ли более эффективный способ подсчета числа результатов запроса, которые будут возвращены?

I знать, что SQLite предоставляет функцию COUNT (https://www.sqlitetutorial.net/sqlite-count-function/), которая кажется более эффективной, но есть ли способ вызвать ее через ODB, или мне нужно было бы переписать запрос в нативном SQLite ( https://www.codesynthesis.com/products/odb/doc/manual.xhtml#3 .12 )

1 Ответ

0 голосов
/ 01 апреля 2020

В моем случае ответом было использование представлений ODB (https://www.codesynthesis.com/products/odb/doc/manual.xhtml#10).

Этот код устанавливает представление.

#pragma db view object(person)
struct PersonCount
{
    #pragma db column("COUNT(" + person::first + ")")
    std::size_t numPeople;
};

Тогда он может использоваться для подсчета числа людей, которые соответствуют данному запросу.

transaction t( db.begin() );
PersonCount pc( db.query_value<PersonCount>( query::first == "John" ) );
t.commit();

cout << pc.numPeople << '\n';
...