我正在尝试使用EntityFramework和Linq从下面的方法中获取总记录数。返回计数很慢。

public static int totalTracking(int id)
{
   using (var ctx = new GPEntities())
   {
      var tr = ctx.Tracking
                   .Where(c => c.clientID == Config.ClientID)
                   .Where(c => c.custID == id)
                   .Where(c => c.oOrderNum.HasValue)
                  .ToList();
      return tr.Count();
   }
}

最佳答案

您可以大大简化查询:

using (var ctx = new GPEntities())
{
    return ctx.Tracking
        .Where(c => c.clientID == Config.ClientID)
        .Where(c => c.custID == id)
        .Where(c => c.oOrderNum.HasValue)
        .Count();
}

当您调用ToList时,这将触发实现,因此将向数据库发出查询,并将检索所有列。实际计数将在客户端上发生。

如果只执行Count,而没有ToList,则在调用Count时将发出查询,并且服务器将仅返回一个数字,而不是表。

这对性能并不是很关键,但是我认为如果没有那么多Where,代码看起来会有些不错:
using (var ctx = new GPEntities())
{
    return ctx.Tracking
        .Where(c =>
            c.clientID == Config.ClientID &&
            c.custID == id &&
            c.oOrderNum.HasValue)
        .Count();
}

甚至
using (var ctx = new GPEntities())
{
    return ctx.Tracking
        .Count(c =>
            c.clientID == Config.ClientID &&
            c.custID == id &&
            c.oOrderNum.HasValue);
}

10-06 07:43