Подтвердить что ты не робот

Получить общее количество строк в Entity Framework

Я использую Entity Framework, чтобы получить общее количество строк для таблицы. Я просто хочу подсчет строк, не где предложение или что-то в этом роде. Следующий запрос работает, но работает медленно. Потребовалось около 7 секунд, чтобы вернуть счет 4475.

Мое предположение заключается в том, что он выполняет итерацию по всей таблице, так же, как работает метод расширения IEnumerable.Count().

Есть ли способ, которым я могу получить общее количество строк "быстро"? есть лучший способ?

    public int GetLogCount()
    {
        using (var context = new my_db_entities(connection_string))
        {
            return context.Logs.Count();
        }
    }
4b9b3361

Ответ 1

Вот как получить счетчик строк с помощью Entity Framework. Вероятно, вы увидите более высокую производительность во втором + запросе, так как при первом запуске будет стоить инициализация. (И он должен генерировать запрос Select Count() здесь, а не итерировать через каждую строку).

Если вам интересен быстрый способ получить количество строк в таблице, вы можете попробовать использовать мини-ORM, например Dapper или OrmLite.

Вы также должны убедиться, что ваша таблица правильно определена (по крайней мере, она имеет первичный ключ), поскольку отказ сделать это также может повлиять на время подсчета строк в таблице.

Ответ 2

Вы можете даже запустить Raw SQL-запрос с использованием структуры сущности, как показано ниже:

var sql = "SELECT COUNT(*) FROM dbo.Logs";
var total = context.Database.SqlQuery<int>(sql).Single();

Ответ 3

Если у вас есть доступ к этому, было бы гораздо быстрее запросить таблицы sys, чтобы извлечь эту информацию.

например.

public Int64 GetLogCount()
{
    var tableNameParam = new SqlParameter("TableName", "Logs");
    var schemaNameParam = new SqlParameter("SchemaName", "dbo");
    using (var context = new my_db_entities(connection_string))
    {
        var query = @"
            SELECT ISNULL([RowCount],0)
            FROM (
                SELECT  SchemaName,
                        TableName, 
                        Sum(I.rowcnt) [RowCount]
                FROM    sysindexes I 
                        JOIN sysobjects O (nolock) ON I.id = o.id AND o.type = 'U' 
                        JOIN (
                            SELECT  so.object_id, 
                                    ss.name as SchemaName,
                                    so.name as TableName
                                FROM   sys.objects SO (nolock) 
                                    JOIN sys.schemas SS (nolock) ON ss.schema_id = so.schema_id
                        ) SN 
                            ON SN.object_id = o.id 
                WHERE   I.indid IN ( 0, 1 )
                AND     TableName = @TableName AND SchemaName = @SchemaName
                GROUP BY 
                        SchemaName, TableName
            ) A
        ";

        return context.ExecuteStoreQuery<Int64>(query, tableNameParam, schemaNameParam).First();
    }
}