原始SQL的运行速度是否比等效的LINQ方法快?

时间:2017-08-10 12:30:44

标签: c# sql-server linq

我有这个方法返回具有给定搜索条件的行数:

public int HistoryCount(Guid id, string tableName)
{
    int sqlCount = context.Database.SqlQuery<int>("SELECT COUNT(*) FROM 
        COMMON.TbHistoryLog WHERE ObjectId = '" + id + "' 
        AND TableName = '" + tableName + "'").First();
    FuncHistory = x => x.ObjectId == id && x.TableName == tableName;
    return AuditHelper.HistoryCount(context.TbHistoryLog, FuncHistory);
}

这是AuditHelper.HistoryCount方法:

public static int HistoryCount<TSet>(DbSet<TSet> set, Func<TSet, bool> predict) where TSet : class
{
    var auditCount = set.Count(predict);
    return auditCount;
}

我在执行AuditHelper.HistoryCount方法时遇到了很长的查询时间,然后我尝试使用原始SQL运行相同的查询(我猜),后者立即返回结果。

我的实现是否有问题,或者原始SQL比等效的LINQ方法更快?

1 个答案:

答案 0 :(得分:3)

因为您在助手函数中使用Count(Func<>),所以您正在调用Enumerable.Count(),这意味着您从数据库中提取所有记录,然后在本地处理谓词和计数。您需要使用Expression<Func<>>来使用将由SQL服务器处理的Queryable.Count()

public static int HistoryCount<TSet>(DbSet<TSet> set, Expression<Func<TSet, bool>> predict) where TSet : class {
    var auditCount = set.Count(predict);
    return auditCount;
}

然后编码就好了:

return AuditHelper.HistoryCount(context.TbHistoryLog, x => x.ObjectId == id && x.TableName == tableName);

或声明FuncHistoryExpression

Expression<Func<TBHistoryLog, bool>> FuncHistory = x => x.ObjectId == id && x.TableName == tableName;