我正在使用Entity Framework来获取表的总行数。我只想要行计数,没有where子句或类似的东西。以下查询有效,但速度很慢。返回计数4475大约需要7秒钟。
我的猜测是,它正在遍历整个表格,就像IEnumerable.Count()扩展方法的工作方式一样。
有没有办法可以“快速”获得总行数?有更好的方法吗?
public int GetLogCount()
{
using (var context = new my_db_entities(connection_string))
{
return context.Logs.Count();
}
}
答案 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()
查询,而不是遍历每一行)。
如果您对以更快的方式获取表格中的原始行数感兴趣,那么您可能想尝试使用像Dapper或OrmLite这样的迷你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();
}
}