我有这个方法返回具有给定搜索条件的行数:
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方法更快?
答案 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);
或声明FuncHistory
为Expression
:
Expression<Func<TBHistoryLog, bool>> FuncHistory = x => x.ObjectId == id && x.TableName == tableName;