获取实体框架中的总行数

时间:2013-08-28 14:24:34

标签: c# sql-server entity-framework

我正在使用Entity Framework来获取表的总行数。我只想要行计数,没有where子句或类似的东西。以下查询有效,但速度很慢。返回计数4475大约需要7秒钟。

我的猜测是,它正在遍历整个表格,就像IEnumerable.Count()扩展方法的工作方式一样。

有没有办法可以“快速”获得总行数?有更好的方法吗?

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

3 个答案:

答案 0 :(得分:7)

您甚至可以使用实体框架触发Raw SQL查询,如下所示:

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

答案 1 :(得分:6)

这是使用Entity Framework获取行数的方法。您可能会在第二次+查询时看到更快的性能,因为第一次运行时会出现初始化成本。 (它应该在这里生成Select Count()查询,而不是遍历每一行)。

如果您对以更快的方式获取表格中的原始行数感兴趣,那么您可能想尝试使用像DapperOrmLite这样的迷你ORM。

您还应该确保您的表已正确定义(至少,它具有主键),因为如果不这样做也会影响计算表中行的时间。

答案 2 :(得分:1)

如果您有权访问,那么查询sys表以获取此信息会更快。

E.g。

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();
    }
}